從eslint規則學點JavaScript知識


在知識星球陸續發了些eslint小知識,意在通過eslint知識去了解規則內部的原理,匯總在此:

prefer-const

含義:始終用const定義你從不修改的變量,如果會被修改則使用let,永不使用var。

理由:讓你寫代碼的時候更明確哪些變量是會被修改的,哪些是不會修改的。幫你理清邏輯,減少bug

 

no-array-constructor

含義: 不要使用Array構造器去創建數組,總是使用字面量。

理由: 當給Array構造器傳一個參數時可能造成混淆,比如 new Array(3),它表示什么呢?

1) [undefined, undefined, undefined];

2)[3],

你可能在這兩種結果中猶豫 另外一個理由就是,Array構造器可能被改寫,有不可預知的風險。

 

no-prototype-builtins

含義: 禁止直接調用Object原型上的方法,如foo.hasOwnProperty('name'). 應該換用Object.prototype.hasOwnProperty.call(foo, 'name')

理由:Object.create方法允許給新創建的對象指定原型,意味着對象的原型可能是不明確的。如果用Object.create(null)創建了無原型的對象,再調用Object原型上的方法就報錯

 

func-style

含義:用於指定定義函數的方式,有兩個值:expression--表達式,declaration--函數聲明

理由:用函數聲名的方式定義的函數,會進行變量提升,有可能給人帶來理解上的困惑,而表達式定義的不會。為了統一代碼風格,最好確定一種函數定義風格。

 

prefer-rest-params

含義: 建議用剩余參數語法function f(a, b, ...args)來動態獲取函數參數,而不是使用arguments

理由:

1. 剩余參數得到的是真正的數組,而arguments是類數組,有時候還需要再轉化一步。

2. 剩余參數的語義更明確,即聲明的形參之外的實參會被歸進數組

 

no-useless-escape

含義:不使用多余的轉義符,官方列出了一些沒必要使用轉義符的情況: "\'"; '\"'; "\#"; "\e"; `\"`; `\"${foo}\"`; `\#{foo}`; /\!/; /\@/; 以及需要使用轉義符的地方: "\""; '\''; "\x12"; "\u00a9"; "\371"; "xs\u2111"; `\``; `\${${foo}}`; `$\{${foo}}`; /\\/g; /\t/g; /\w\$\*\^\./;

 

no-param-reassign

含義: 不要給函數的參數重新賦值。比如:function f(arg) { arg = 1; }或function f(obj) { obj.num = 1; }

理由:

1. 給函數的參數重新賦值會改變arguments對象,給后面的代碼帶來風險

2. 如果參數是引用類型,比如對象,修改對象的屬性會影響到傳入函數的那個原始對象

3. 影響V8引擎的性能

4. 改動傳入的參數本身也是不明智的邏輯,如果需要可以復制一份數據再改。

 

arrow-body-style

含義: 箭頭函數的內容是否用大括號包起來,取值有:always--始終用大括號,as-needed--需要的時候使用,never--從不使用

理由: 為了規避箭頭函數語法區別可能帶來的錯誤:函數體只有一行的時候,若不加大括號,會默認把這行代碼的返回結果給return。函數體有多行的時候,必須使用大括號,並且需要自己寫return語句。

 

import/no-mutable-exports

含義:用export暴露模塊內容時,不應暴露可更改的數據。也就是說export出的必須用const定義,如:const name = 'a'; export default name;

理由:模塊暴露的數據、函數等不應被更改。

 

no-multi-assign

含義: 禁止連續賦值,例如:let a = b = c = 1;

理由:

1. b和c會變成全局變量,造成意外風險

2. 閱讀起來不清晰,debug困難

 

no-case-declarations

含義: 不要在switch語句的case中定義變量,包括使用let/const/function/class

理由:

1. switch語句是一個塊級作用域,case下的let看起來是在整個作用域下可見的,但其實是在執行到當前case的時候才被初始化。容易使人迷惑。

2. 避免了在多個case中創建同名變量

推薦寫法:

1. 在switch語句外部定義變量

2. 在case中使用大括號創建新的作用域,如: switch(name){ case 'a': { let xx = 1; break; } }

 

歡迎博主的加入知識星球~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM