命名
- 原則——編碼格式UTF-8,根據功能為變量與方法命名(盡量不縮寫)
- 類——構造函數/類 使用大駝峰命名法
- 方法——動詞、動賓結構,使用小駝峰命名法
ex:get + 非布爾屬性名() is + 布爾屬性名() set + 屬性名() has + 名詞/形容詞() 動詞() 動詞 + 賓語() 建議——類中的私有屬性和方法名,建議以下划線開頭或結尾
實例:
class Foo() {
this._bar = computerBar(); // 私有屬性
this.baz = computerBaz(); // 非私有屬性,可通過實例訪問
} - 變量——小駝峰風格、避免使用否定的布爾變量名、縮寫詞全大/小寫、不要用保留字作鍵名或變量名、jQuery類變量以 $ 開頭
- 常量——全大寫單詞,以下划線連接
- 注釋——復雜的判定條件封裝成名字清晰的方法,把判定結果作為返回值(好的注釋描述代碼為什么這么寫,而不是描述代碼功能)
單行:// 塊: /* / 文檔: /* */(包含用法,參數,返回值說明)
代碼排版格式
- 縮進——只允許空格,使用Tab的話需要更改IDE配置自動將Tab轉化為空格
- 換行——以操作符/運算符開頭
- 方法的參數盡量在一行——長參數名單獨一行
- 對象字面量屬性最多4個同行——大於4個的話每個參數獨占一行
- 鏈式調用方法時一行最多4次——否則需要換行,把點放在前面
- 每行聲明一個變量,禁止連續賦值
- 使用基本類型的字面量而不是其封裝類型
- 禁止變量聲明覆蓋外層作用域的變量
方法
- 方法設計原則——單一職責原則、單一抽象層次
- 參數<=5個——參數過多可抽象為對象、不要把方法入參當作工作變量/臨時變量、默認參數放最后、實現對外API時應對外部傳入參數的合法性進行判斷
- 聲明與實現——使用聲明的方式定義方法而不是表達式、用到匿名函數時盡量使用箭頭函數
function Foo(){}即為聲明式,有函數提升效果 var Foo = function (){}即為表達式,必須先定義后使用
字符串
- 使用單引號(創建一個包含HTML代碼的字符串就會知道原因:標簽屬性需要用雙引號括起來,會跟字符串的雙引號產生配對錯亂問題)
- 使用模板字符串實現字符串拼接(``)
數組
- 將數組當成包裝數據結構使用,使用棧方法和隊列方法(push、pop、shift、unshift等)
- 不要在數組上定義或使用非數字屬性(length除外)
arr['str'] = 'string',數組盡量以索引為鍵
- 遍歷時優先使用Arrary方法,如 forEach、map、filter、every...
- 不要在forEach里進行元素的remove/add操作,會導致遍歷紊亂
- 使用擴展運算符 ... 賦值數組,避免淺拷貝問題
對象
- 對象字面量名稱使用標識符
var object = { id:1, name:'name1' } 不要使用下面這種字符串做鍵 var obj = { 'str':'string' }
- 盡量在一個地方定義對象的所有屬性,即初始化定義對象時就把所有鍵都初始化,盡量不要后續添加屬性
- 對象字面量中使用方法簡寫、屬性簡寫
- 使用點來訪問對象屬性,只有屬性是 動態的時候使用[ ],例如使用for-in遍歷對象時通過key訪問value
- getter和setter應該成對出現在對象中
- 禁止對象實例上直接使用Object.prototype的內置屬性
- 需要約束for-in
- 不要修改內置對象的原型或向原型添加方法
- 使用擴展運算符 ... 進行對象賦值,防止淺拷貝問題
運算與表達式
- if判定條件中,變量在先,字面量在后
- 使用 === 和 !===
- 使用簡寫的條件表達式,例如:當isValid時bool型時,寫if(isValid) 而不是 if(isValid===true)
- 不要在復雜條件表達式前加否定符
- 不要使用否定表達式
- 禁止使用嵌套的三元表達式
- 在混合使用不同的操作符時采用括號明確運算的優先級
- 數值有溢出風險時使用位運算替代四則運算
控制語句
- 每個switch語句都包含一個default語句,即使它不包含任何代碼
- 每個有內容的case中都放置一條break語句,有return的除外
- 對於if-else if類型的條件判斷最后必須包括一個else分支
- 不要用邏輯運算符代替控制語句
正則表達式
- 禁止正則表達式字面量中出現多個空格
- 建議正則表達式中使用命名捕獲組
其他特性
- 注意this的不同分支
- this的使用場合
- 函數是構造函數
- 函數是一個方法
- 允許在以下函數中調用中出現this關鍵字
- 調用了該函數的call/apply/bind方法
- 如果給出thisArg,該函數是數組方法的一個回調
- 函數在JSDoc注釋標記中有@this標簽
- 不要在頂級作用域下使用變量和函數聲明
- 為window上的屬性/方法加上命名空間
模塊
- 代碼中總使用ES6標准的模塊(import/export)方式,而不是使用非標准的模塊模塊化加載器(Node.js代碼除外)
- 不要import通配符 *
- 不要多次import同一模塊
- import的順序依次為內置模塊,外部模塊,內部模塊
- import不要包括Javascript文件拓展名
- import不使用絕對路徑
- import的三方件需加入到package.json
- 當模塊只有一個export時,最好使用默認導出,而不是命名導出
- 如果文件只export一個函數,那么文件名、類名、以及默認導出的名稱應一致
- 不要從import中直接export
- 需要導出的變量必須是const類型或不可變的類型
數值與計算
- 禁止省略小數點前后的0
- 要求調用isNaN()檢查NaN
異常的使用
- 拋出的異常應該是Error錯誤或Error的子類,永遠不要拋出字符串或其他對象
- 要求使用Error對象作為Promise拒絕的原因
- 禁止在finally語句中出現控制流語句
異步
禁用不必要的return await
避免
- 禁止使用eval()
- 禁止使用隱式的eval()
- 禁止使用with(){}
- 禁止使用較短的符號實現類型轉換(即通過運算進行強制類型轉換)
- 禁止多余的return語句
- 不要在HTML中寫過多的JS和CSS代碼
- 不要使用非標准的功能
性能編程規范
- 緩存jQuery查詢結果
- 避免所有元素選擇器
- 有限使用ID選擇器,盡量給選擇器指定上下文context
- 循環中減少DOM操作
- 利用事件代理機制(冒泡)
其他
- 盡量不使用同步請求
- 減少界面DOM的更新(靜態內容盡量不要重排重繪)
- 減少HML標簽數
內存編程規范
- DOM
- 在滿足業務特性需求的情況下,減少DOM對象的動態創建和刪除
- 禁止在循環/事件回調中使用文本+變量的方式使用jQuery創建DOM
- 盡量不適用iframe
- 事件監聽
- 正確使用DOM Event level 2/3標准進行時間的綁定和注銷
- 頁面卸載,動態刪除的DOM對象時要先注銷綁定的事件監聽
- 不要在HTML標簽上嵌入JS事件回調代碼,優先使用jQuery
- 銷毀不再使用的定時器和延時器