Javascript安全編程規范


命名

  1. 原則——編碼格式UTF-8,根據功能為變量與方法命名(盡量不縮寫)
  2. 類——構造函數/類 使用大駝峰命名法
  3. 方法——動詞、動賓結構,使用小駝峰命名法

    ex:get + 非布爾屬性名() is + 布爾屬性名() set + 屬性名() has + 名詞/形容詞() 動詞() 動詞 + 賓語() 建議——類中的私有屬性和方法名,建議以下划線開頭或結尾
    實例
    class Foo() {
      this._bar = computerBar(); // 私有屬性
      this.baz = computerBaz(); // 非私有屬性,可通過實例訪問
    }

  4. 變量——小駝峰風格、避免使用否定的布爾變量名、縮寫詞全大/小寫、不要用保留字作鍵名或變量名、jQuery類變量以 $ 開頭
  5. 常量——全大寫單詞,以下划線連接
  6. 注釋——復雜的判定條件封裝成名字清晰的方法,把判定結果作為返回值(好的注釋描述代碼為什么這么寫,而不是描述代碼功能

    單行://     塊: /* /     文檔: /* */(包含用法,參數,返回值說明)

代碼排版格式

  1. 縮進——只允許空格,使用Tab的話需要更改IDE配置自動將Tab轉化為空格
  2. 換行——以操作符/運算符開頭
  3. 方法的參數盡量在一行——長參數名單獨一行
  4. 對象字面量屬性最多4個同行——大於4個的話每個參數獨占一行
  5. 鏈式調用方法時一行最多4次——否則需要換行,把點放在前面
  6. 每行聲明一個變量,禁止連續賦值
  7. 使用基本類型的字面量而不是其封裝類型
  8. 禁止變量聲明覆蓋外層作用域的變量

方法

  1. 方法設計原則——單一職責原則、單一抽象層次
  2. 參數<=5個——參數過多可抽象為對象、不要把方法入參當作工作變量/臨時變量、默認參數放最后、實現對外API時應對外部傳入參數的合法性進行判斷
  3. 聲明與實現——使用聲明的方式定義方法而不是表達式、用到匿名函數時盡量使用箭頭函數

    function Foo(){}即為聲明式,有函數提升效果 var Foo = function (){}即為表達式,必須先定義后使用

字符串

  1. 使用單引號(創建一個包含HTML代碼的字符串就會知道原因:標簽屬性需要用雙引號括起來,會跟字符串的雙引號產生配對錯亂問題)
  2. 使用模板字符串實現字符串拼接(``)

數組

  1. 將數組當成包裝數據結構使用,使用棧方法和隊列方法(push、pop、shift、unshift等)
  2. 不要在數組上定義或使用非數字屬性(length除外)

    arr['str'] = 'string',數組盡量以索引為鍵

  3. 遍歷時優先使用Arrary方法,如 forEach、map、filter、every...
  4. 不要在forEach里進行元素的remove/add操作,會導致遍歷紊亂
  5. 使用擴展運算符 ... 賦值數組,避免淺拷貝問題

對象

  1. 對象字面量名稱使用標識符

    var object = { id:1, name:'name1' } 不要使用下面這種字符串做鍵 var obj = { 'str':'string' }

  2. 盡量在一個地方定義對象的所有屬性,即初始化定義對象時就把所有鍵都初始化,盡量不要后續添加屬性
  3. 對象字面量中使用方法簡寫、屬性簡寫
  4. 使用點來訪問對象屬性,只有屬性是 動態的時候使用[ ],例如使用for-in遍歷對象時通過key訪問value
  5. getter和setter應該成對出現在對象中
  6. 禁止對象實例上直接使用Object.prototype的內置屬性
  7. 需要約束for-in
  8. 不要修改內置對象的原型或向原型添加方法
  9. 使用擴展運算符 ... 進行對象賦值,防止淺拷貝問題

運算與表達式

  1. if判定條件中,變量在先,字面量在后
  2. 使用 === 和 !===
  3. 使用簡寫的條件表達式,例如:當isValid時bool型時,寫if(isValid) 而不是 if(isValid===true)
  4. 不要在復雜條件表達式前加否定符
  5. 不要使用否定表達式
  6. 禁止使用嵌套的三元表達式
  7. 在混合使用不同的操作符時采用括號明確運算的優先級
  8. 數值有溢出風險時使用位運算替代四則運算

控制語句

  1. 每個switch語句都包含一個default語句,即使它不包含任何代碼
  2. 每個有內容的case中都放置一條break語句,有return的除外
  3. 對於if-else if類型的條件判斷最后必須包括一個else分支
  4. 不要用邏輯運算符代替控制語句

正則表達式

  1. 禁止正則表達式字面量中出現多個空格
  2. 建議正則表達式中使用命名捕獲組

其他特性

  1. 注意this的不同分支
  2. this的使用場合
    1. 函數是構造函數
    2. 函數是一個方法
    3. 允許在以下函數中調用中出現this關鍵字
      1. 調用了該函數的call/apply/bind方法
      2. 如果給出thisArg,該函數是數組方法的一個回調
      3. 函數在JSDoc注釋標記中有@this標簽
  3. 不要在頂級作用域下使用變量和函數聲明
  4. 為window上的屬性/方法加上命名空間

模塊

  1. 代碼中總使用ES6標准的模塊(import/export)方式,而不是使用非標准的模塊模塊化加載器(Node.js代碼除外)
  2. 不要import通配符 *
  3. 不要多次import同一模塊
  4. import的順序依次為內置模塊,外部模塊,內部模塊
  5. import不要包括Javascript文件拓展名
  6. import不使用絕對路徑
  7. import的三方件需加入到package.json
  8. 當模塊只有一個export時,最好使用默認導出,而不是命名導出
  9. 如果文件只export一個函數,那么文件名、類名、以及默認導出的名稱應一致
  10. 不要從import中直接export
  11. 需要導出的變量必須是const類型或不可變的類型

數值與計算

  1. 禁止省略小數點前后的0
  2. 要求調用isNaN()檢查NaN

異常的使用

  1. 拋出的異常應該是Error錯誤或Error的子類,永遠不要拋出字符串或其他對象
  2. 要求使用Error對象作為Promise拒絕的原因
  3. 禁止在finally語句中出現控制流語句

異步

禁用不必要的return await

避免

  1. 禁止使用eval()
  2. 禁止使用隱式的eval()
  3. 禁止使用with(){}
  4. 禁止使用較短的符號實現類型轉換(即通過運算進行強制類型轉換)
  5. 禁止多余的return語句
  6. 不要在HTML中寫過多的JS和CSS代碼
  7. 不要使用非標准的功能

性能編程規范

  1. 緩存jQuery查詢結果
  2. 避免所有元素選擇器
  3. 有限使用ID選擇器,盡量給選擇器指定上下文context
  4. 循環中減少DOM操作
  5. 利用事件代理機制(冒泡)

其他

  1. 盡量不使用同步請求
  2. 減少界面DOM的更新(靜態內容盡量不要重排重繪)
  3. 減少HML標簽數

內存編程規范

  1. DOM
    1. 在滿足業務特性需求的情況下,減少DOM對象的動態創建和刪除
    2. 禁止在循環/事件回調中使用文本+變量的方式使用jQuery創建DOM
    3. 盡量不適用iframe
  2. 事件監聽
    1. 正確使用DOM Event level 2/3標准進行時間的綁定和注銷
    2. 頁面卸載,動態刪除的DOM對象時要先注銷綁定的事件監聽
    3. 不要在HTML標簽上嵌入JS事件回調代碼,優先使用jQuery
    4. 銷毀不再使用的定時器和延時器


免責聲明!

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



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