JavaScript Standard Style
English • Español (Latinoamérica) • Français • Bahasa Indonesia • Italiano (Italian) • 日本語 (Japanese) • 한국어 (Korean) • Português (Brasil) • 简体中文 (Simplified Chinese) • 繁體中文 (Taiwanese Mandarin)
Ini adalah ringkasan dari peraturan penggunaan Javascript standard.
Cara terbaik untuk belajar tentang standard adalah dengan memasangnya pada projek Anda dan cobalah didalam kode anda.
Peraturan
-
Gunakan 2 spasi untuk indentasi.
eslint:
indentfunction hello (name) { console.log('hi', name) } -
Gunakan tanda kutip tunggal untuk string kecuali untuk menghindari escaping.
eslint:
quotesconsole.log('hello there') // ✓ ok console.log("hello there") // ✗ hindari console.log(`hello there`) // ✗ hindari $("<div class='box'>") // ✓ ok console.log(`hello ${name}`) // ✓ ok -
Tidak ada variabel yang tidak digunakan.
eslint:
no-unused-varsfunction myFunction () { var result = something() // ✗ hindari } -
Tambahkan spasi setelah keyword.
eslint:
keyword-spacingif (condition) { ... } // ✓ ok if(condition) { ... } // ✗ hindari -
Tambahkan spasi sebelum kurung dari deklarasi fungsi.
eslint:
space-before-function-parenfunction name (arg) { ... } // ✓ ok function name(arg) { ... } // ✗ hindari run(function () { ... }) // ✓ ok run(function() { ... }) // ✗ hindari -
Selalu gunakan
===daripada==.
Pengecualian:obj == nulldiperbolehkan untuk memeriksanull || undefined.eslint:
eqeqeqif (name === 'John') // ✓ ok if (name == 'John') // ✗ hindariif (name !== 'John') // ✓ ok if (name != 'John') // ✗ hindari -
Infix operators must be spaced.
-
Operator Infix harus diberi spasi.
eslint:
space-infix-ops// ✓ ok var x = 2 var message = 'hello, ' + name + '!'// ✗ hindari var x=2 var message = 'hello, '+name+'!' -
Tanda koma harus memiliki spasi setelahnya.
eslint:
comma-spacing// ✓ ok var list = [1, 2, 3, 4] function greet (name, options) { ... }// ✗ hindari var list = [1,2,3,4] function greet (name,options) { ... } -
Simpan statemen else pada baris yang sama dengan kurung kurawalnya.
eslint:
brace-style// ✓ ok if (condition) { // ... } else { // ... }// ✗ hindari if (condition) { // ... } else { // ... } -
Untuk statemen if yang menggunakan beberapa baris, gunakan kurung kurawal.
eslint:
curly// ✓ ok if (options.quiet !== true) console.log('done')// ✓ ok if (options.quiet !== true) { console.log('done') }// ✗ hindari if (options.quiet !== true) console.log('done') -
Selalu tangani parameter fungsi
err.eslint:
handle-callback-err// ✓ ok run(function (err) { if (err) throw err window.alert('done') })// ✗ hindari run(function (err) { window.alert('done') }) -
Mendeklarasikan browser global dengan sebuah komen
/* global */.
Pengecualian:window,document, andnavigator.
Hindari penggunaan dari penamaan variabel sepertiopen,length,event, andname./* global alert, prompt */ alert('hi') prompt('ok?')Referensikan secara jelas fungsi atau properti didalam
windowjuga ok, walaupun kode tidak akan berjalan didalam Worker yang mana menggunakanselfdaripadawindow.eslint:
no-undefwindow.alert('hi') // ✓ ok -
Baris kosong ganda tidak diperbolehkan.
eslint:
no-multiple-empty-lines// ✓ ok var value = 'hello world' console.log(value)// ✗ hindari var value = 'hello world'
console.log(value)
* **Untuk operator _ternary_** didalam setingan _multi-line_, tambahkan `?` dan `:` pada barisnya masing-masing.
eslint: [`operator-linebreak`](http://eslint.org/docs/rules/operator-linebreak)
```js
// ✓ ok
var location = env.development ? 'localhost' : 'www.api.com'
// ✓ ok
var location = env.development
? 'localhost'
: 'www.api.com'
// ✗ hindari
var location = env.development ?
'localhost' :
'www.api.com'
-
Untuk mendeklarasikan var, tulis setiap deklarasinya didalam statemennya masing-masing.
eslint:
one-var// ✓ ok var silent = true var verbose = true // ✗ hindari var silent = true, verbose = true // ✗ hindari var silent = true, verbose = true -
Bungkus conditional assignments dengan kurung tambahan. Hal ini memperjelas bahwa ekspresinya adalah assignment (
=) daripada sebuah typo untuk persamaan (===).eslint:
no-cond-assign// ✓ ok while ((m = text.match(expr))) { // ... } // ✗ hindari while (m = text.match(expr)) { // ... } -
Tambahkan spasi didalam blok baris tunggal.
eslint:
block-spacingfunction foo () {return true} // ✗ hindari function foo () { return true } // ✓ ok -
Gunakan camelcase ketika memberi nama variabel dan fungsi.
eslint:
camelcasefunction my_function () { } // ✗ hindari function myFunction () { } // ✓ ok var my_var = 'hello' // ✗ hindari var myVar = 'hello' // ✓ ok -
Trailing commas not allowed.
-
Akhiran koma tidak diperbolehkan.
eslint:
comma-danglevar obj = { message: 'hello', // ✗ hindari } -
Koma harus ditempatkan pada akhir dari baris.
eslint:
comma-stylevar obj = { foo: 'foo' ,bar: 'bar' // ✗ hindari } var obj = { foo: 'foo', bar: 'bar' // ✓ ok } -
Titik harus berada pada baris yang sama dengan propertinya.
eslint:
dot-locationconsole. log('hello') // ✗ hindari console .log('hello') // ✓ ok -
Berkas harus berakhir dengan baris baru.
eslint:
eol-last -
Tidak ada spasi diantara identifier fungsi dan pemanggilannya.
eslint:
func-call-spacingconsole.log ('hello') // ✗ hindari console.log('hello') // ✓ ok -
Tambahkan spasi diantara kolon dan nilai didalam pasangan key value.
eslint:
key-spacingvar obj = { 'key' : 'value' } // ✗ hindari var obj = { 'key' :'value' } // ✗ hindari var obj = { 'key':'value' } // ✗ hindari var obj = { 'key': 'value' } // ✓ ok -
Nama konstruktor harus dimulai dengan huruf kapital.
eslint:
new-capfunction animal () {} var dog = new animal() // ✗ hindari function Animal () {} var dog = new Animal() // ✓ ok -
Konstruktor tanpa argumen harus dipanggil dengan kurung.
eslint:
new-parensfunction Animal () {} var dog = new Animal // ✗ hindari var dog = new Animal() // ✓ ok -
Objek harus mengandung sebuah
getterketikasetter-nya digunakan.eslint:
accessor-pairsvar person = { set name (value) { // ✗ hindari this._name = value } } var person = { set name (value) { this._name = value }, get name () { // ✓ ok return this._name } } -
Konstruktor dari kelas yang diturunkan harus memanggil
super.eslint:
constructor-superclass Dog { constructor () { super() // ✗ hindari this.legs = 4 } } class Dog extends Animal { constructor () { // ✗ hindari this.legs = 4 } } class Dog extends Animal { constructor () { super() // ✓ ok this.legs = 4 } } -
Gunakan array literals daripada menggunakan array constructors.
eslint:
no-array-constructorvar nums = new Array(1, 2, 3) // ✗ hindari var nums = [1, 2, 3] // ✓ ok -
Hindari menggunakan
arguments.calleedanarguments.caller.eslint:
no-callerfunction foo (n) { if (n <= 0) return arguments.callee(n - 1) // ✗ hindari } function foo (n) { if (n <= 0) return foo(n - 1) // ✓ ok } -
Hindari memodifikasi variabel dari pendeklarasian class.
eslint:
no-class-assignclass Dog {} Dog = 'Fido' // ✗ hindari -
Hindari memodifikasi variabel yang dideklarasikan dengan
const.eslint:
no-const-assignconst score = 100 score = 125 // ✗ hindari -
Hindari menggunakan ekspresi konstan didalam conditional (kecuali perulangan).
eslint:
no-constant-conditionif (false) { // ✗ hindari // ... } if (x === 0) { // ✓ ok // ... } while (true) { // ✓ ok // ... } -
Tidak ada control characters didalam regular expressions.
eslint:
no-control-regexvar pattern = /\x1f/ // ✗ hindari var pattern = /\x20/ // ✓ ok -
Tidak ada statemen
debugger.eslint:
no-debuggerfunction sum (a, b) { debugger // ✗ hindari return a + b } -
Tidak ada operator
deletedidalam variabel.eslint:
no-delete-varvar name delete name // ✗ hindari -
Tidak ada duplikasi argumen didalam definisi fungsi.
eslint:
no-dupe-argsfunction sum (a, b, a) { // ✗ hindari // ... } function sum (a, b, c) { // ✓ ok // ... } -
Tidak ada duplikasi nama didalam class member.
eslint:
no-dupe-class-membersclass Dog { bark () {} bark () {} // ✗ hindari } -
Tidak ada duplikasi keys didalam objek literal.
eslint:
no-dupe-keysvar user = { name: 'Jane Doe', name: 'John Doe' // ✗ hindari } -
Tidak ada duplikasi label
casedidalam statemenswitch.eslint:
no-duplicate-caseswitch (id) { case 1: // ... case 1: // ✗ hindari } -
Gunakan statemen import tunggal per modul.
eslint:
no-duplicate-importsimport { myFunc1 } from 'module' import { myFunc2 } from 'module' // ✗ hindari import { myFunc1, myFunc2 } from 'module' // ✓ ok -
Tidak ada karakter kelas kosong didalam regular expressions.
eslint:
no-empty-character-classconst myRegex = /^abc[]/ // ✗ hindari const myRegex = /^abc[a-z]/ // ✓ ok -
Tidak ada pola destrukturing yang kosong.
eslint:
no-empty-patternconst { a: {} } = foo // ✗ hindari const { a: { b } } = foo // ✓ ok -
Tidak menggunakan
eval().eslint:
no-evaleval( "var result = user." + propName ) // ✗ avoid var result = user[propName] // ✓ ok -
Tidak memasukan ulang exceptions didalam klausa
catch.eslint:
no-ex-assigntry { // ... } catch (e) { e = 'new value' // ✗ hindari } try { // ... } catch (e) { const newVal = 'new value' // ✓ ok } -
Tidak meng-extend objek native.
eslint:
no-extend-nativeObject.prototype.age = 21 // ✗ hindari -
Hindari binding fungsi yang tidak dibutuhkan.
eslint:
no-extra-bindconst name = function () { getName() }.bind(user) // ✗ hindari const name = function () { this.getName() }.bind(user) // ✓ ok -
Hindai menggunakan boolean yang tidak dibutuhkan.
eslint:
no-extra-boolean-castconst result = true if (!!result) { // ✗ hindari // ... } const result = true if (result) { // ✓ ok // ... } -
Tidak ada kurung yang tidak dibutuhkan disekitar ekspresi fungsi.
eslint:
no-extra-parensconst myFunc = (function () { }) // ✗ hindari const myFunc = function () { } // ✓ ok -
Gunakan
breakuntuk menghentikan alur didalamswitch.eslint:
no-fallthroughswitch (filter) { case 1: doSomething() // ✗ hindati case 2: doSomethingElse() } switch (filter) { case 1: doSomething() break // ✓ ok case 2: doSomethingElse() } switch (filter) { case 1: doSomething() // fallthrough // ✓ ok case 2: doSomethingElse() } -
Tidak ada floating decimals.
eslint:
no-floating-decimalconst discount = .5 // ✗ hindari const discount = 0.5 // ✓ ok -
Hindari memasukan ulang deklarasi fungsi.
eslint:
no-func-assignfunction myFunc () { } myFunc = myOtherFunc // ✗ hindari -
Tidak memasukan ulang variabel global yang bersifat read-only.
eslint:
no-global-assignwindow = {} // ✗ hindari -
Tidak ada
eval()yang disisipkan.eslint:
no-implied-evalsetTimeout("alert('Hello world')") // ✗ hindari setTimeout(function () { alert('Hello world') }) // ✓ ok -
Tidak ada deklarasi fungsi didalam blok bersarang.
eslint:
no-inner-declarationsif (authenticated) { function setAuthUser () {} // ✗ hindari } -
Tidak ada string regular expression yang invalid didalam konstruktor
RegExp.eslint:
no-invalid-regexpRegExp('[a-z') // ✗ hindari RegExp('[a-z]') // ✓ ok -
Tidak ada whitespace yang tidak teratur.
eslint:
no-irregular-whitespacefunction myFunc () /*<NBSP>*/{} // ✗ hindari -
Tidak ada penggunaan
__iterator__.eslint:
no-iteratorFoo.prototype.__iterator__ = function () {} // ✗ hindari -
Tidak ada label dengan nama yang sama didalam scope variabel.
eslint:
no-label-varvar score = 100 function game () { score: while (true) { // ✗ hindari score -= 10 if (score > 0) continue score break } } -
Tidak ada statemen label.
eslint:
no-labelslabel: while (true) { break label // ✗ hindari } -
Tidak ada blok bersarang yang tidak dibutuhkan.
eslint:
no-lone-blocksfunction myFunc () { { // ✗ hindari myOtherFunc() } } function myFunc () { myOtherFunc() // ✓ ok } -
Hindari mencampurkan spasi dan tabs untuk indentasi.
eslint:
no-mixed-spaces-and-tabs -
Tidak diperbolehkan menggunakan spasi ganda kecuali untuk indentasi.
eslint:
no-multi-spacesconst id = 1234 // ✗ hindari const id = 1234 // ✓ ok -
Tidak ada string yang multiline.
eslint:
no-multi-strconst message = 'Hello \ world' // ✗ hindari -
Tidak ada
newtanpa memasukan objek kedalam sebuah variabel.eslint:
no-newnew Character() // ✗ hindari const character = new Character() // ✓ ok -
Tidak menggunakan konstruktor
Function.eslint:
no-new-funcvar sum = new Function('a', 'b', 'return a + b') // ✗ hindari -
Tidak menggunakan konstruktor
Object.eslint:
no-new-objectlet config = new Object() // ✗ hindari -
tidak ada penggunaan
new require.eslint:
no-new-requireconst myModule = new require('my-module') // ✗ hindari -
Tidak ada penggunaan konstruktor
Symbol.eslint:
no-new-symbolconst foo = new Symbol('foo') // ✗ hindari -
Tidak ada penggunaan pembungkus primitiv.
eslint:
no-new-wrappersconst message = new String('hello') // ✗ hindari -
Tidak memanggil properti objek global sebagai sebuah fungsi.
eslint:
no-obj-callsconst math = Math() // ✗ hindari -
Tidak ada literal octal.
eslint:
no-octalconst octal = 042 // ✗ hindari const decimal = 34 // ✓ ok const octalString = '042' // ✓ ok -
Tidak ada tanda escape untuk octal didalam literal string.
eslint:
no-octal-escapeconst copyright = 'Copyright \251' // ✗ hindari -
Hindari penggabungan string ketika menggunakan
__dirnamedan__filename.eslint:
no-path-concatconst pathToFile = __dirname + '/app.js' // ✗ hindari const pathToFile = path.join(__dirname, 'app.js') // ✓ ok -
Hindari menggunakan
__proto__. Lebih baik gunakangetPrototypeOf.eslint:
no-protoconst foo = obj.__proto__ // ✗ hindari const foo = Object.getPrototypeOf(obj) // ✓ ok -
Tidak ada pendeklarasian ulang variabel.
eslint:
no-redeclarelet name = 'John' let name = 'Jane' // ✗ hindari let name = 'John' name = 'Jane' // ✓ ok -
Hindari penggunaan spasi ganda didalam literal regular expressions.
eslint:
no-regex-spacesconst regexp = /test value/ // ✗ hindari const regexp = /test {3}value/ // ✓ ok const regexp = /test value/ // ✓ ok -
Assignments didalam statemen return harus dibungkus dengan kurung.
eslint:
no-return-assignfunction sum (a, b) { return result = a + b // ✗ hindari } function sum (a, b) { return (result = a + b) // ✓ ok } -
Hindari memasukan variabel kedalam dirinya-sendiri
eslint:
no-self-assignname = name // ✗ hindari -
Hindari persamaan variabel dengan dirinya-sendiri.
eslint:
no-self-compareif (score === score) {} // ✗ hindari -
Hindari penggunaan operator koma.
eslint:
no-sequencesif (doSomething(), !!test) {} // ✗ hindari -
Penamaan yang bersifat restricted tidak diperbolehkan.
eslint:
no-shadow-restricted-nameslet undefined = 'value' // ✗ hindari -
Nilai kosong didalam array tidak diperbolehkan.
eslint:
no-sparse-arrayslet fruits = ['apple',, 'orange'] // ✗ hindari -
Tabs seharusnya tidak boleh digunakan
eslint:
no-tabs -
String regular tidak boleh mengandung template literal.
eslint:
no-template-curly-in-stringconst message = 'Hello ${name}' // ✗ hindari const message = `Hello ${name}` // ✓ ok -
super()harus dipanggil sebelum menggunakanthis.eslint:
no-this-before-superclass Dog extends Animal { constructor () { this.legs = 4 // ✗ hindari super() } } -
Hanya
throwsebuah objekError.eslint:
no-throw-literalthrow 'error' // ✗ hindari throw new Error('error') // ✓ ok -
Whitespace tidak diperbolehkan pada akhiran baris.
eslint:
no-trailing-spaces -
Menginisialisasi
undefinedtidak diperbolehkan.eslint:
no-undef-initlet name = undefined // ✗ hindari let name name = 'value' // ✓ ok -
Tidak ada kondisi pada perulangan yang tidak berubah.
eslint:
no-unmodified-loop-conditionfor (let i = 0; i < items.length; j++) {...} // ✗ hindari for (let i = 0; i < items.length; i++) {...} // ✓ ok -
Tidak ada operator ternary ketika alternative yang lebih simple ada.
eslint:
no-unneeded-ternarylet score = val ? val : 0 // ✗ hindari let score = val || 0 // ✓ ok -
Tidak ada kode yang tidak bisa dijangkau setelah statemen
return,throw,continue, andbreakstatements.eslint:
no-unreachablefunction doSomething () { return true console.log('never called') // ✗ hindari } -
Tidak ada statemen flow control didalam blok
finally.eslint:
no-unsafe-finallytry { // ... } catch (e) { // ... } finally { return 42 // ✗ hindari } -
Operan sisi kiri dari operator relasional harus bukanlah negatif.
eslint:
no-unsafe-negationif (!key in obj) {} // ✗ hindari if (!(key in obj)) {} // ✓ ok -
Avoid unnecessary use of
.call()and.apply(). -
Hindari penggunaan dari
.call()dan.apply().eslint:
no-useless-callsum.call(null, 1, 2, 3) // ✗ hindari -
Hindari penggunaan dari komputasi properti keys didalam objek yang tidak dibutuhkan.
eslint:
no-useless-computed-keyconst user = { ['name']: 'John Doe' } // ✗ hindari const user = { name: 'John Doe' } // ✓ ok -
Tidak ada konstruktor yang tidak dibutuhkan.
eslint:
no-useless-constructorclass Car { constructor () { // ✗ hindari } } -
Hindari penggunaan dari karakter escape yang tidak dibutuhkan.
eslint:
no-useless-escapelet message = 'Hell\o' // ✗ hindari -
Menamai ulang import, export, and destructured assignments dengan nama yang sama tidak diperbolehkan.
eslint:
no-useless-renameimport { config as config } from './config' // ✗ hindari import { config } from './config' // ✓ ok -
Tidak ada whitespace sebelum properti.
eslint:
no-whitespace-before-propertyuser .name // ✗ hindari user.name // ✓ ok -
Tidak menggunakan statemen
with.eslint:
no-withwith (val) {...} // ✗ hindari -
Pertahankan konsistensi dari baris baru diantara properti objek.
eslint:
object-property-newlineconst user = { name: 'Jane Doe', age: 30, username: 'jdoe86' // ✗ hindari } const user = { name: 'Jane Doe', age: 30, username: 'jdoe86' } // ✓ ok const user = { name: 'Jane Doe', age: 30, username: 'jdoe86' } // ✓ ok -
Tidak ada padding diantara blok.
eslint:
padded-blocksif (user) { // ✗ hindari const name = getName() } if (user) { const name = getName() // ✓ ok } -
Tidak ada whitespace diantara operator spread dan ekspresinya.
eslint:
rest-spread-spacingfn(... args) // ✗ hindari fn(...args) // ✓ ok -
Semicolons harus memiliki spasi setelah dan tidak ada spasi sebelumnya.
eslint:
semi-spacingfor (let i = 0 ;i < items.length ;i++) {...} // ✗ hindari for (let i = 0; i < items.length; i++) {...} // ✓ ok -
Harus ada spasi sebelum blok.
eslint:
space-before-blocksif (admin){...} // ✗ hindari if (admin) {...} // ✓ ok -
Tidak ada spasi didalam kurung.
eslint:
space-in-parensgetName( name ) // ✗ hindari getName(name) // ✓ ok -
Operator unary harus memiliki spasi setelahnya.
eslint:
space-unary-opstypeof!admin // ✗ hindari typeof !admin // ✓ ok -
Gunakan spasi didalam komentar.
eslint:
spaced-comment//comment // ✗ hindari // comment // ✓ ok /*comment*/ // ✗ hindari /* comment */ // ✓ ok -
Tidak ada spasi didalam template string.
eslint:
template-curly-spacingconst message = `Hello, ${ name }` // ✗ hindari const message = `Hello, ${name}` // ✓ ok -
Gunakan
isNaN()ketika memeriksaNaN.eslint:
use-isnanif (price === NaN) { } // ✗ hindari if (isNaN(price)) { } // ✓ ok -
typeofharus dibandingkan dengan string yang valid.eslint:
valid-typeoftypeof name === 'undefimed' // ✗ hindari typeof name === 'undefined' // ✓ ok -
Immediately Invoked Function Expressions (IIFEs) harus dibungkus.
eslint:
wrap-iifeconst getName = function () { }() // ✗ hindari const getName = (function () { }()) // ✓ ok const getName = (function () { })() // ✓ ok -
Tanda
*didalam ekspresiyield*harus memiliki spasi sebelum dan sesudahnya.eslint:
yield-star-spacingyield* increment() // ✗ hindari yield * increment() // ✓ ok -
Hindari kondisi Yoda.
eslint:
yodaif (42 === age) { } // ✗ hindari if (age === 42) { } // ✓ ok
Semicolons
-
Tidak ada semicolons. (see: 1, 2, 3)
eslint:
semiwindow.alert('hi') // ✓ ok window.alert('hi'); // ✗ hindari -
Jangan pernah memulai baris dengan
(,[,`, atau segelintir kode yang mirip lainnya.Ini adalah hal yang terjadi dengan menghilangkan semicolons, dan
standardmelindungi kamu dari potensi masalah ini.(Daftar penuhnya adalah :
[,(,`,+,*,/,-,,,., tapi kebanyakan dari ini tidak pernah muncul pada awal baris didalam kode yang sesungguhnya.)eslint:
no-unexpected-multiline// ✓ ok ;(function () { window.alert('ok') }()) // ✗ hindari (function () { window.alert('ok') }())// ✓ ok ;[1, 2, 3].forEach(bar) // ✗ hindari [1, 2, 3].forEach(bar)// ✓ ok ;`hello`.indexOf('o') // ✗ hindari `hello`.indexOf('o')Catatan: Jika kamu sering menulis kode seperti ini, kamu mungkin mencoba terlalu jauh.
Percobaan yang asal-asalan tidak direkomendasikan, dengan alasan dari kebersihan dan keterbacaan kode, kapanpun itu.
Daripada seperti ini:
;[1, 2, 3].forEach(bar)Contoh dibawah lebih direkomendasikan:
var nums = [1, 2, 3] nums.forEach(bar)
Bacaan lanjutan
- An Open Letter to JavaScript Leaders Regarding Semicolons
- JavaScript Semicolon Insertion – Everything you need to know
Video tambahan:
Seluruh minifier kode yang terkenal dan digunakan sekarang menggunakan AST-based minification, jadi mereka dapat menangani Javascript tanpa semicolon dengan lancar (sejak semicolon tidak wajib didalam Javascript).
Kutipan dari "An Open Letter to JavaScript Leaders Regarding Semicolons":
[Bergantung kepada pemasukan semicolon otomatis] cukup aman, dan bagus untuk JS yang valid yang mana setiap browser mengerti. Closure compiler, yuicompressor, packer, and jsmin semuadapat secara mudah me-minify. Tidak ada masalah dalam performansi.
Maaf, daripada mengedukasi kamu, orang yang memimpin komunitas bahasa ini telah memberikan kamu kebohongan dan ketakutan. Itu adalah hal yang mememalukan. Saya merekomendasikan belajar bagaimana statemen didalam Javascript diakhiri (dan dimana saat mereka tidak diakhiri), jadi kamu bisa menulis kode yang menurutmu indah.
Secara umum,
\nmengakhiri statemen kecuali: 1. Statemennya memiliki parent yang belum ditutup, literal array, atau objek literal atau berakhir di suatu tempat, other way that is not a valid way to end a statement. (For instance, ending with.cara lainnya bukanlah cara yang valid untuk mengakhiri statemen. (Contoh, berakhir dengan.atau,.) 2. Barisnya adalah--atau++(yang mana akan melakukan incement/decrement token selanjutnya.) 3. Ini adalahfor(),while(),do,if(), atauelse, dan tidak ada{4. Baris selanjutnya dimulai dengan[,(,+,*,/,-,,,., atau operator biner yang bisa hanya ditemukan diantara dua token didalam ekspresi tunggal.Hal yang pertama cukup jelas. Bahkan JSLint ok dengan hal karakter
\ndidalam JSON dan konstruksi tanda kurung, dan dengan statemenvaryang menjangkau beberapa baris dan berakhir dengan,.Yang kedua super aneh. Saya tidak pernah melihat sebuah kasus (diluar dari pembahasan ini). ketika kamu ingin menulis
i\n++\nj, tapi, faktanya, potongan kode itu diurai menjadii; ++j, bukani++; j.Yang ketiga mudah dipahami, jika secara umum tidak disukai.
if (x)\ny()sama denganif (x) { y() }. Konstruksinya tidak berakhir sampai itu mencapai blok lainnya, atau sebuah statemen.
;adalah statemen Javascript yang valid, jadiif(x);adalah sama denganif(x){}atau, “Jika x, tidak melakukan apapun.” Hal ini lebih banyak digunakan didalam perulangan dimana perulangannya juga memeriksa apakah fungsinya update. Tidak biasa, tapi bukannya belum pernah dengar.Yang keempat secara umum sama seperti kasus “oh tidak, kamu butuh semicolon!”. Tapi, seperti yang terjadi, cukup mudah untuk membetulkan barisnya dengan semicolon jika kamu tidak mengartikan barisnya adalah lanjutan dari baris sebelumnya. Contoh, daripada:
foo(); [1,2,3].forEach(bar);Kamu bisa melakukan hal ini:
foo() ;[1,2,3].forEach(bar)Keuntungannya adalah _prefix_nya mudah untuk diperhatikan, sekalinya kamu telah terbiasa melihat baris yang dimulai tanpa
(atau[tanpa semicolon.