JavaScript 風格指南/編碼規範(Airbnb公司版)

kinolee發表於2014-11-14

Airbnb 是一家位於美國舊金山的公司,本文是其內部的 JavaScript 風格指南/編碼規範,在 Github 上有 11,000+ Star,2100+ fork,前端開發者可參考。

  • 基本型別:當你訪問基本型別時,你是直接對它的值進行操作。
    • string
    • number
    • boolean
    • null
    • undefined
  • object
  • array
  • function

物件

  • 使用字面量語法來建立物件
  • 不要使用保留字作為“鍵值”,因為在IE8不能執行。More info
  • 使用容易理解的同義詞來替代保留字
  • 陣列

  • 使用字面量語法來建立陣列
  • 如果你不知道陣列長度,陣列新增成員使用push方法。
  • 當你需要複製一個陣列時,使用陣列的slice方法。jsPerf
  • 當你需要把“類似陣列物件”轉為陣列時,使用陣列的slice方法。
  • 字串

  • 字串使用單引號‘’
  • 大於80個元素的字串需要通過分隔符進行多行操作。
  • 注意:如果在長字串中過度使用分隔符會影響效能。. jsPerf & Discussion
  • 通過程式設計的方式建立字串,應該使用陣列的join方法,而不是字串連結方法。特別是對於IE而言。 jsPerf.
  • 函式

  • 函式表示式
  • 不要直接在非函式塊(if,while等)裡宣告一個函式,最好將函式賦值給一個變數。雖然瀏覽器允許你在非函式塊中宣告函式,但是由於不同的瀏覽器對Javascript的解析方式不同,這樣做就很可能造成麻煩。
  • 注意:ECMA-262 將塊定義為一組語句,而函式宣告不是語句。Read ECMA-262′s note on this issue
  • 不要將引數命名為arguments,它將在每個函式的作用範圍內優先於arguments物件。
  • 屬性

  • 使用點符號 . 來訪問屬性
  • 當你在變數中訪問屬性時,使用[ ]符號
  • 變數

  • 使用var來宣告變數,否則將宣告全域性變數,我們需要儘量避免汙染全域性名稱空間,Captain Planet這樣警告過我們。
  • 多個變數時只使用一個var宣告,每個變數佔一新行。
  • 最後再宣告未賦值的變數,這對你之後需要依賴之前變數的變數賦值會有幫助。
  • 在範圍內將變數賦值置頂,這有助於避免變數宣告和賦值提升相關的問題
  • 提升

  • 變數宣告在範圍內提升,但賦值並沒有提升
  • 匿名函式表示式提升變數名,但函式賦值並沒有提升,
  • 命名函式表示式提升變數名,但函式名字和函式體並沒有提升。
  • 函式宣告能提升他們的函式名和函式體
  • 更多的資訊在JavaScript Scoping & Hoisting by Ben Cherry

 

  • 條件表示式和相等

  • 條件表示式強制使用 ToBoolean方法進行解析,並遵從以下簡單的規則Object :返回 true
  • Undefined 返回 false
  • Null 返回 false
  • Booleans :返回 boolean的值
  • Numbers :如果是+0, -0, or NaN返回 false, 其他則 true
  • Strings :空字串''返回 false 其他返回true
  • 使用簡易方式
  • 更多的資訊檢視 Truth Equality and JavaScript by Angus Croll

  • 在多行塊中使用大括號

註釋

  • 多行註釋使用 /** ... */ ,包括描述,指定型別、所有引數的值和返回值
  • 單行註釋使用 //, 在註釋的內容前另起一行進行單行註釋,並在註釋前留一空行。
  • 在你的註釋加上FIXME或TODO的字首可以幫助其他開發者迅速理解你指出的問題和需要的幫助,以及你建議需要完善的解決問題,這跟常規註釋不一樣因為其具有可行動性,FIXME——是需要解決的而TODO——是需要完善的
  • 使用// FIXME: 來標記問題
  • 使用 // TODO:給待解決問題進行標註
  • 空格

  • 使用tabs設定兩個空格
  • 分支前面空一格
  • 操作符前後空一格
  • 檔案末尾用換行符結束
  • 使用長方法鏈時使用縮排
  • 逗號

  • 不要在句首使用逗號
  • 不要使用多餘的逗號,這在IE6/7 和 IE9的混雜模式中會造成問題,同樣,在ES3中有些實現,如果使用多餘的逗號將增加陣列的長度,這在ES5中有闡明(source):
  • 分號

  • 轉型&強制

  • 在語句的開頭執行強制轉型。
  • Strings:
  • 使用parseIntNumbers型進行強制轉型。
  • 如果出於某種原因你需要做些特別的事,而parseInt是你的瓶頸,出於效能考慮你需要使用位移,那麼留下你的註釋來解釋原因。
  • 注意:小心位移操作符,Numbers代表著64位的值,而位移操作符只能返回32位的整型,位移對於大於32位的整型的值會有不好的影響,32位最大的有符號整型是2,147,483,647。
  • (有關討論:Discussion
  • Booleans:
  • 命名規則

  • 不要使用一個字母命名,而應該用單詞描述
  • 使用駝峰法來給物件、函式、例項命名。
  • 使用駝峰式大小寫給建構函式和類命名。
  • 使用下劃線字首_來命名私有屬性。
  • 儲存this的引用使用_this
  • 給你的函式命名,這有助於堆疊重寫
  • 注意:IE8以下還有一些關於命名函式表示式的怪癖。詳情見http://kangax.github.io/nfe/

 

  • 訪問器

  • 如果你建立訪問函式使用getVal() 和 setVal(‘hello’)

如果這個屬性是boolean,使用isVal() 或者 hasVal()

 

.也可以使用get() 和 set()函式來建立,但是必須一致。

    • 構造器

    • 給原型物件新增方法,相比用新物件重寫原型,重寫原型會有繼承問題。如果你要重寫原型方法,請重寫基礎方法。
    • 方法返回this有助於方法鏈
    • 可以重寫常規的toString()方法。但必須保證可以成功執行並沒有別的影響
    • 將為事件載入資料時(不管是DOM事件還是其他專用事件的,比如Backbone事件)用雜湊表來取代原始值。因為這將允許後續新增更多的資料載入事件而不用更新每個事件的處理程式。例如:

更好的方式:

模組

  • 模組應該以 “!”開始,以確保當模組忘記包含最後一個分號時,在指令碼連線時不會報錯。
  • 文件需要用駝峰法命名,同一檔案內要用一樣的名字以及要與單個輸出相匹配。
  • 增加一個叫noConflict()的方法,使模組輸出早期版本並返回。
  • 在模組開始的部位宣告'use strict'

jQuery

  • JQuery物件變數字首使用$
  • jQuery快取查詢
  • 在DOM查詢中使用層疊樣式 $('.sidebar ul')parent > child $('.sidebar > ul')jsPerf
  • 使用find來查詢jQuery物件

相關文章