掌握本規範的最好方法是安裝並在本身的代碼中使用它。html
細則
-
使用兩個空格進行縮進。java
eslint:
indent
gitconsole} -
除須要轉義的狀況外,字符串統一使用單引號。github
eslint:
quotes
正則表達式console -
不要定義未使用的變量。api
eslint:
no-unused-vars
數組var result =} -
關鍵字後面加空格。瀏覽器
eslint:
keyword-spacing
安全ifif -
函數聲明時括號與函數名間加空格。
eslint:
space-before-function-paren
-
始終使用
===
替代==
。
例外:obj == null
能夠用來檢查null || undefined
。eslint:
eqeqeq
ifififif -
字符串拼接操做符 (Infix operators) 之間要留空格。
eslint:
space-infix-ops
// ✓ okvar x = 2var message = 'hello, ' + name + '!'// ✗ avoidvar x=2var message = 'hello, '+name+'!' -
逗號後面加空格。
eslint:
comma-spacing
// ✓ okvar list =// ✗ avoidvar list = -
else 關鍵字要與花括號保持在同一行。
eslint:
brace-style
// ✓ okif// ...// ...// ✗ avoidif// ...else// ... -
多行 if 語句的的括號不能省。
eslint:
curly
// ✓ okif// ✓ okifconsole// ✗ avoidifconsole -
不要丟掉異常處理中
err
參數。eslint:
handle-callback-err
// ✓ ok// ✗ avoid -
使用瀏覽器全局變量時加上
window.
前綴。
Exceptions are:document
,console
andnavigator
.eslint:
no-undef
window -
不容許有連續多行空行。
eslint:
no-multiple-empty-lines
// ✓ okvar value = 'hello world'console// ✗ avoidvar value = 'hello world'console -
對於三元運算符
?
和:
與他們所負責的代碼處於同一行eslint:
operator-linebreak
// ✓ okvar location = env// ✓ okvar location = env? 'localhost': 'www.api.com'// ✗ avoidvar location = env'localhost' :'www.api.com' -
每一個 var 關鍵字單獨聲明一個變量。
eslint:
one-var
// ✓ okvar silent = truevar verbose = true// ✗ avoidvar silent = true// ✗ avoidvar silent = trueverbose = true -
條件語句中賦值語句使用括號包起來。這樣使得代碼更加清晰可讀,而不會認爲是將條件判斷語句的全等號(
===
)錯寫成了等號(=
)。eslint:
no-cond-assign
// ✓ okwhile// ...// ✗ avoidwhile// ... -
單行代碼塊兩邊加空格。
eslint:
block-spacing
-
對於變量和函數名統一使用駝峯命名法。
eslint:
camelcase
var my_var = 'hello' // ✗ avoidvar myVar = 'hello' // ✓ ok -
不容許有多餘的行末逗號。
eslint:
comma-dangle
var obj =message: 'hello' -
始終將逗號置於行末。
eslint:
comma-style
var obj =foo: 'foo'var obj =foo: 'foo'bar: 'bar' // ✓ ok -
點號操做符須與屬性需在同一行。
eslint:
dot-location
consoleconsole -
文件末尾留一空行。
eslint:
eol-last
-
函數調用時標識符與括號間不留間隔。
eslint:
func-call-spacing
consoleconsole -
鍵值對當中冒號與值之間要留空白。
eslint:
key-spacing
var obj =var obj =var obj =var obj = -
構造函數要以大寫字母開頭。
eslint:
new-cap
var dog =var dog = -
無參的構造函數調用時要帶上括號。
eslint:
new-parens
var dog =var dog = -
對象中定義了存值器,必定要對應的定義取值器。
eslint:
accessor-pairs
var person =this}var person =this}return this} -
子類的構造器中必定要調用
super
eslint:
constructor-super
super}super} -
使用數組字面量而不是構造器。
eslint:
no-array-constructor
var nums =var nums = -
避免使用
arguments.callee
和arguments.caller
。eslint:
no-caller
ifarguments}if} -
避免對類名從新賦值。
eslint:
no-class-assign
Dog = 'Fido' // ✗ avoid -
避免修改使用
const
聲明的變量。eslint:
no-const-assign
const score = 100score = 125 // ✗ avoid -
避免使用常量做爲條件表達式的條件(循環語句除外)。
eslint:
no-constant-condition
if// ...if// ...while// ... -
正則中不要使用控制符。
eslint:
no-control-regex
var pattern = /\x1f/ // ✗ avoidvar pattern = /\x20/ // ✓ ok -
不要使用
debugger
。eslint:
no-debugger
debugger // ✗ avoidreturn a + b} -
不要對變量使用
delete
操做。eslint:
no-delete-var
var namedelete name // ✗ avoid -
不要定義冗餘的函數參數。
eslint:
no-dupe-args
// ...}// ...} -
類中不要定義冗餘的屬性。
eslint:
no-dupe-class-members
-
對象字面量中不要定義重複的屬性。
eslint:
no-dupe-keys
var user =name: 'Jane Doe'name: 'John Doe' // ✗ avoid -
switch
語句中不要定義重複的case
分支。eslint:
no-duplicate-case
-
同一模塊有多個導入時一次性寫完。
eslint:
no-duplicate-imports
-
正則中不要使用空字符。
eslint:
no-empty-character-class
const myRegex = /^abc[]/ // ✗ avoidconst myRegex = /^abc[a-z]/ // ✓ ok -
不要解構空值。
eslint:
no-empty-pattern
constconst -
不要使用
eval()
。eslint:
no-eval
var result = user -
catch
中不要對錯誤從新賦值。eslint:
no-ex-assign
try// ...e = 'new value' // ✗ avoidtry// ...const newVal = 'new value' // ✓ ok -
不要擴展原生對象。
eslint:
no-extend-native
Object -
避免多餘的函數上下文綁定。
eslint:
no-extra-bind
const name =}const name =this} -
避免沒必要要的布爾轉換。
eslint:
no-extra-boolean-cast
const result = trueif// ...const result = trueif// ... -
不要使用多餘的括號包裹函數。
eslint:
no-extra-parens
const myFunc =const myFunc = -
switch
必定要使用break
來將條件分支正常中斷。eslint:
no-fallthrough
-
不要省去小數點前面的0。
eslint:
no-floating-decimal
const discount =const discount = 0 -
避免對聲明過的函數從新賦值。
eslint:
no-func-assign
myFunc = myOtherFunc // ✗ avoid -
不要對全局只讀對象從新賦值。
eslint:
no-global-assign
window = {} // ✗ avoid -
注意隱式的
eval()
。eslint:
no-implied-eval
-
嵌套的代碼塊中禁止再定義函數。
eslint:
no-inner-declarations
if -
不要向
RegExp
構造器傳入非法的正則表達式。eslint:
no-invalid-regexp
RegExpRegExp -
不要使用非法的空白符。
eslint:
no-irregular-whitespace
-
禁止使用
__iterator__
。eslint:
no-iterator
Foo -
外部變量不要與對象屬性重名。
eslint:
no-label-var
var score = 100score: whilescore -= 10ifbreak} -
不要使用標籤語句。
eslint:
no-labels
label:whilebreak label // ✗ avoid -
不要書寫沒必要要的嵌套代碼塊。
eslint:
no-lone-blocks
}} -
不要混合使用空格與製表符做爲縮進。
eslint:
no-mixed-spaces-and-tabs
-
除了縮進,不要使用多個空格。
eslint:
no-multi-spaces
const id = 1234 // ✗ avoidconst id = 1234 // ✓ ok -
不要使用多行字符串。
eslint:
no-multi-str
const message = 'Hello \world' // ✗ avoid -
new
建立對象實例後須要賦值給變量。eslint:
no-new
const character = -
禁止使用
Function
構造器。eslint:
no-new-func
var sum = -
禁止使用
Object
構造器。eslint:
no-new-object
let config = -
禁止使用
new require
。eslint:
no-new-require
const myModule = -
禁止使用
Symbol
構造器。eslint:
no-new-symbol
const foo = -
禁止使用原始包裝器。
eslint:
no-new-wrappers
const message = -
不要將全局對象的屬性做爲函數調用。
eslint:
no-obj-calls
const math = Math -
不要使用八進制字面量。
eslint:
no-octal
const num = 042 // ✗ avoidconst num = '042' // ✓ ok -
字符串字面量中也不要使用八進制轉義字符。
eslint:
no-octal-escape
const copyright = 'Copyright \251' // ✗ avoid -
使用
__dirname
和__filename
時儘可能避免使用字符串拼接。eslint:
no-path-concat
const pathToFile = __dirname + '/app.js' // ✗ avoidconst pathToFile = path -
使用
getPrototypeOf
來替代__proto__
。eslint:
no-proto
const foo = objconst foo = Object -
不要重複聲明變量。
eslint:
no-redeclare
let name = 'John'let name = 'Jane' // ✗ avoidlet name = 'John'name = 'Jane' // ✓ ok -
正則中避免使用多個空格。
eslint:
no-regex-spaces
const regexp = /test value/ // ✗ avoidconst regexp = /test {3}value/ // ✓ okconst regexp = /test value/ // ✓ ok -
return 語句中的賦值必需有括號包裹。
eslint:
no-return-assign
return result = a + b // ✗ avoid}return} -
避免將變量賦值給本身。
eslint:
no-self-assign
name = name // ✗ avoid -
避免將變量與本身進行比較操做。
esint:
no-self-compare
if -
避免使用逗號操做符。
eslint:
no-sequences
if -
不要隨意更改關鍵字的值。
eslint:
no-shadow-restricted-names
let undefined = 'value' // ✗ avoid -
禁止使用稀疏數組(Sparse arrays)。
eslint:
no-sparse-arrays
let fruits = -
不要使用製表符。
eslint:
no-tabs
-
正確使用 ES6 中的字符串模板。
eslint:
no-template-curly-in-string
const message = 'Hello ${name}' // ✗ avoidconst message = `Hello -
使用
this
前請確保super()
已調用。eslint:
no-this-before-super
thissuper} -
用
throw
拋錯時,拋出Error
對象而不是字符串。eslint:
no-throw-literal
throw 'error' // ✗ avoidthrow -
行末不留空格。
eslint:
no-trailing-spaces
-
不要使用
undefined
來初始化變量。eslint:
no-undef-init
let name = undefined // ✗ avoidlet namename = 'value' // ✓ ok -
循環語句中注意更新循環變量。
eslint:
no-unmodified-loop-condition
forfor -
若是有更好的實現,儘可能不要使用三元表達式。
eslint:
no-unneeded-ternary
let score = val ? val : 0 // ✗ avoidlet score = val || 0 // ✓ ok -
return
,throw
,continue
和break
後不要再跟代碼。eslint:
no-unreachable
return trueconsole} -
finally
代碼塊中不要再改變程序執行流程。eslint:
no-unsafe-finally
try// ...// ...return 42 // ✗ avoid -
關係運算符的左值不要作取反操做。
eslint:
no-unsafe-negation
if -
避免沒必要要的
.call()
和.apply()
。eslint:
no-useless-call
sum -
避免使用沒必要要的計算值做對象屬性。
eslint:
no-useless-computed-key
const user =const user = -
禁止多餘的構造器。
eslint:
no-useless-constructor
} -
禁止沒必要要的轉義。
eslint:
no-useless-escape
let message = 'Hell\o' // ✗ avoid -
import, export 和解構操做中,禁止賦值到同名變量。
eslint:
no-useless-rename
-
屬性前面不要加空格。
eslint:
no-whitespace-before-property
useruser -
禁止使用
with
。eslint:
no-with
with -
對象屬性換行時注意統一代碼風格。
eslint:
object-property-newline
const user =name: 'Jane Doe'username: 'jdoe86' // ✗ avoidconst user =const user =name: 'Jane Doe'age: 30username: 'jdoe86' -
代碼塊中避免多餘留白。
eslint:
padded-blocks
if// ✗ avoidconst name =ifconst name = -
展開運算符與它的表達式間不要留空白。
eslint:
rest-spread-spacing
-
遇到分號時空格要後留前不留。
eslint:
semi-spacing
forfor -
代碼塊首尾留空格。
eslint:
space-before-blocks
ifif -
圓括號間不留空格。
eslint:
space-in-parens
-
一元運算符後面跟一個空格。
eslint:
space-unary-ops
typeof!admin // ✗ avoidtypeof !admin // ✓ ok -
註釋首尾留空格。
eslint:
spaced-comment
//comment // ✗ avoid// comment // ✓ ok/*comment*/ // ✗ avoid/* comment */ // ✓ ok -
模板字符串中變量先後不加空格。
eslint:
template-curly-spacing
const message = `Hello,const message = `Hello, -
檢查
NaN
的正確姿式是使用isNaN()
。eslint:
use-isnan
ifif -
用合法的字符串跟
typeof
進行比較操做。eslint:
valid-typeof
typeof name === 'undefimed' // ✗ avoidtypeof name === 'undefined' // ✓ ok -
自調用匿名函數 (IIFEs) 使用括號包裹。
eslint:
wrap-iife
const getName =const getName =const getName = -
yield *
中的*
先後都要有空格。eslint:
yield-star-spacing
-
請書寫優雅的條件語句(avoid Yoda conditions)。
eslint:
yoda
ifif
關於分號
-
eslint:
semi
windowwindow -
不要使用
(
,[
, or`
等做爲一行的開始。在沒有分號的狀況下代碼壓縮後會致使報錯,而堅持這一規範則可避免出錯。eslint:
no-unexpected-multiline
// ✓ ok;window}// ✗ avoidwindow}// ✓ ok;// ✗ avoid// ✓ ok;`hello`// ✗ avoid`hello`備註:上面的寫法只能說聰明過頭了。
相比更加可讀易懂的代碼,那些看似投巧的寫法是不可取的。
譬如:
;建議的寫法是:
var nums =nums
拓展閱讀
- An Open Letter to JavaScript Leaders Regarding Semicolons
- JavaScript Semicolon Insertion – Everything you need to know
一個值得觀看的視頻:
當前主流的代碼壓縮方案都是基於詞法(AST-based)進行的,因此在處理無分號的代碼時徹底沒有壓力(況且 JavaScript 中分號原本就不是強制的)。
一段摘抄自 "An Open Letter to JavaScript Leaders Regarding Semicolons" 這篇文章的內容:
[自動化插入分號的作法]是安全可依賴的,並且其產出的代碼可以在全部瀏覽器裏很好地運行。 Closure compiler, yuicompressor, packer 還有 jsmin 都能正確地對這樣的代碼進行壓縮處理。並無任何性能相關的問題。
不得不說,Javascript 社區裏的大牛們一直是錯誤的,並不能教給你最佳實踐。真是讓人憂傷啊。 我建議先弄清楚 JS 是怎樣斷句的(還有就是哪些地方看起來斷了其實並無),明白了這個後就能夠隨心寫出漂亮的代碼了。
通常來講,
\n
表示語句結束,除非:
- 該語句有未閉合的括號, 數組字面量, 對象字面量 或者其餘不能正常結束一條語句的狀況(譬如,以
.
或,
結尾)- 該語句是
--
或者++
(它會將後面的內容進行自增或減)- 該語句是
for()
,while()
,do
,if()
或者else
而且沒有{
- 下一行以
[
,(
,+
,*
,/
,-
,,
,.
或者其餘只會單獨出如今兩塊內容間的二元操做符。第一條很容易理解。即便在 JSLint 中,也容許 JSON,構造器的括號中,以及使用
var
配合,
結尾來聲明多個變量等這些情中包含\n
。第二條有點奇葩。 我還想不出誰會(除了這裏用做討論外)寫出
i\n++\nj
這樣的代碼來,不過,順便說一下,這種寫法最後解析的結果是i; ++j
,而不是i++; j
。第三條也容易理解。
if (x)\ny()
等價於if (x) { y() }
。解釋器會向下尋找到代碼塊或一條語句爲止。
;
是條合法的 JavaScript 語句。因此if(x);
等價於if(x){}
,表示 「若是 x 爲真,什麼也不作。」 這種寫法在循環裏面能夠看到,就是當條件判斷與條件更新是同一個方法的時候。 不常見,但也不至於沒據說過吧。第四條就是常見的 「看,說過要加分號!」 的情形。但這些狀況能夠經過在語句前面加上分號來解決,若是你肯定該語句跟前面的不要緊的話。舉個例子,假如你想這樣:
那麼徹底能夠這樣來寫:
;後者的好處是分號比較矚目,一旦習慣後便不再會看到以
(
和[
開頭又不帶分號的語句了。