- 類型
- 對象
- 數組
- 字元串
- 函數
- 屬性
- 變量
- 提升
- 比較運算符 & 等号
- 塊
- 注釋
- 空白
- 逗号
- 分号
- 類型轉化
- 命名規則
- 存取器
- 構造函數
- 事件
- 子產品
- jQuery
- ECMAScript 5 相容性
- 測試
- 性能
- 資源
- 誰在使用
類 型
- 原始值: 存取直接作用于它自身。
-
string
-
number
-
boolean
-
null
-
undefined
|
- 複雜類型: 存取時作用于它自身值的引用。
-
object
-
array
-
function
|
對象
- 使用直接量建立對象。
|
- 不要使用保留字作為鍵名,它們在 IE8 下不工作。
|
- 使用同義詞替換需要使用的保留字。
|
數組
- 使用直接量建立數組。
|
- 向數組增加元素時使用 Array#push 來替代直接指派。
|
- 當你需要拷貝數組時,使用 Array#slice。jsPerf
|
- 使用 Array#slice 将類數組對象轉換成數組。
|
字元串
- 使用單引号
包裹字元串。''
|
- 超過 100 個字元的字元串應該使用連接配接符寫成多行。
- 注:若過度使用,通過連接配接符連接配接的長字元串可能會影響性能。jsPerf
|
- 程式化生成的字元串使用 Array#join 連接配接而不是使用連接配接符。尤其是 IE 下:jsPerf.(http://jsperf.com/ya-string-concat)
|
函數
- 函數表達式
|
- 永遠不要在一個非函數代碼塊(if、while 等)中聲明一個函數,把那個函數賦給一個變量。浏覽器允許你這麼做,但它們的解析表現不一緻。
- 注: ECMA-262 把
定義為一組語句。函數聲明不是語句。閱讀對 ECMA-262 這個問題的說明。(http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf#page=97)塊
|
- 永遠不要把參數命名為
。這将取代函數作用域内的arguments
對象。arguments
|
屬性
- 使用
來通路對象的屬性。.
|
- 當通過變量通路屬性時使用中括号
。[]
|
變量
- 總是使用
來聲明變量。不這麼做将導緻産生全局變量。我們要避免污染全局命名空間。var
|
- 使用
var
聲明每一個變量。
這樣做的好處是增加新變量将變的更加容易,而且你永遠不用再擔心調換錯
跟;
。,
|
- 最後再聲明未指派的變量。當你需要引用前面的變量指派時這将變的很有用。
|
- 在作用域頂部聲明變量。這将幫你避免變量聲明提升相關的問題。
|
提升
- 變量聲明會提升至作用域頂部,但指派不會。
|
- 匿名函數表達式會提升它們的變量名,但不會提升函數的指派。
|
- 命名函數表達式會提升變量名,但不會提升函數名或函數體。
|
- 函數聲明提升它們的名字和函數體。
|
- 了解更多資訊在 JavaScript Scoping & Hoisting by Ben Cherry.(http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting)
比較運算符 & 等号
- 優先使用
和===
而不是!==
和==
.!=
- 條件表達式例如
語句通過抽象方法if
強制計算它們的表達式并且總是遵守下面的規則:ToBoolean
- 對象 被計算為 true
- Undefined 被計算為 false
- Null 被計算為 false
- 布爾值 被計算為 布爾的值
- 數字 如果是 +0、-0 或 NaN 被計算為 false,否則為 true
- 字元串 如果是空字元串
被計算為 false,否則為 true''
|
- 使用快捷方式。
|
- 了解更多資訊在 Truth Equality and JavaScript by Angus Croll.(http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/#more-2108)
塊
- 使用大括号包裹所有的多行代碼塊。
|
- 如果通過
和if
使用多行代碼塊,把else
放在else
代碼塊關閉括号的同一行。if
|
注釋
- 使用 作為多行注釋。包含描述、指定所有參數和傳回值的類型和值。
|
- 使用
作為單行注釋。在評論對象上面另起一行使用單行注釋。在注釋前插入空行。//
|
- 給注釋增加
或FIXME
的字首可以幫助其他開發者快速了解這是一個需要複查的問題,或是給需要實作的功能提供一個解決方式。這将有别于常見的注釋,因為它們是可操作的。使用TODO
或者FIXME -- need to figure this out
。TODO -- need to implement
- 使用
标注問題。// FIXME:
|
- 使用
标注問題的解決方式。// TODO:
|
空白
- 使用 2 個空格作為縮進(如果習慣了用Tab 可以在編輯器中把Tab設定為2個空格。
|
- 在大括号前放一個空格。
|
- 在控制語句(
、if
等)的小括号前放一個空格。在函數調用及聲明中,不在函數的參數清單前加空格。while
|
- 使用空格把運算符隔開。
|
- 在檔案末尾插入一個空行。
|
- 在使用長方法鍊時進行縮進。使用前面的點
強調這是方法調用而不是新語句。.
|
- 在塊末和新語句前插入空行。
|
逗号
- 行首逗号: 不需要。
|
- 額外的行末逗号:不需要。這樣做會在 IE6/7 和 IE9 怪異模式下引起問題。同樣,多餘的逗号在某些 ES3 的實作裡會增加數組的長度。在 ES5 中已經澄清了 (source):
> Edition 5 clarifies the fact that a trailing comma at the end of an ArrayInitialiser does not add to the length of the array. This is not a semantic change from Edition 3 but some implementations may have previously misinterpreted this.
|
分号
- 使用分号。
|
[了解更多](http://stackoverflow.com/a/7365214/1712802).
類型轉換
- 在語句開始時執行類型轉換。
- 字元串:
|
- 使用
轉換數字時總是帶上類型轉換的基數。parseInt
|
- 如果因為某些原因
成為你所做的事的瓶頸而需要使用位操作解決性能問題(http://jsperf.com/coercion-vs-casting/3)時,留個注釋說清楚原因和你的目的。parseInt
|
- 注: 小心使用位操作運算符。數字會被當成 64 位值(http://es5.github.io/#x4.3.19),但是位操作運算符總是傳回 32 位的整數(source(http://es5.github.io/#x11.7))。位操作處理大于 32 位的整數值時還會導緻意料之外的行為。最大的 32 位整數是 2,147,483,647:
|
- 布爾:
|
存取器
- 屬性的存取函數不是必須的。
- 如果你需要存取函數時使用
和getVal()
。setVal('hello')
|
- 如果屬性是布爾值,使用
或isVal()
。hasVal()
|
- 建立 get() 和 set() 函數是可以的,但要保持一緻。
|
構造函數
- 給對象原型配置設定方法,而不是使用一個新對象覆寫原型。覆寫原型将導緻繼承出現問題:重設原型将覆寫原有原型!
|
- 方法可以傳回
來實作方法鍊式使用。this
|
- 寫一個自定義的
方法是可以的,但是確定它可以正常工作且不會産生副作用。toString()
|
事件
- 當給事件附加資料時(無論是 DOM 事件還是私有事件),傳入一個哈希而不是原始值。這樣可以讓後面的貢獻者增加更多資料到事件資料而無需找出并更新事件的每一個處理器。例如,不好的寫法:
|
子產品
- 子產品應該以
開始。這樣確定了當一個不好的子產品忘記包含最後的分号時,在合并代碼到生産環境後不會産生錯誤。詳細說明(https://github.com/airbnb/javascript/issues/44#issuecomment-13063933)!
- 檔案應該以駝峰式命名,并放在同名的檔案夾裡,且與導出的名字一緻。
- 增加一個名為
的方法來設定導出的子產品為前一個版本并傳回它。noConflict()
- 永遠在子產品頂部聲明
。'use strict';
|
⬆ 回到頂部
jQuery
- 使用
作為存儲 jQuery 對象的變量名字首。$
|
- 緩存 jQuery 查詢。
|
- 對 DOM 查詢使用層疊
或 父元素 > 子元素$('.sidebar ul')
。 jsPerf(http://jsperf.com/jquery-find-vs-context-sel/16)$('.sidebar > ul')
- 對有作用域的 jQuery 對象查詢使用
。find
|
ECMAScript 5 相容性
- 參考 Kangax 的 ES5 相容表.(http://kangax.github.com/es5-compat-table/)
⬆ 回到頂部
測試
- Yup.
|
⬆ 回到頂部
性能
- On Layout & Web Performance(http://kellegous.com/j/2013/01/26/layout-performance/)
- String vs Array Concat(http://jsperf.com/string-vs-array-concat/2)
- Try/Catch Cost In a Loop(http://jsperf.com/try-catch-in-loop-cost)
- Bang Function(http://jsperf.com/bang-function)
- jQuery Find vs Context, Selector(http://jsperf.com/jquery-find-vs-context-sel/13)
- innerHTML vs textContent for script text(http://jsperf.com/innerhtml-vs-textcontent-for-script-text)
- Long String Concatenation(http://jsperf.com/ya-string-concat)
- Loading…
⬆ 回到頂部
推薦閱讀
- Annotated ECMAScript 5.1(http://es5.github.com/)
工具
- Code Style Linters
- JSHint - Airbnb Style .jshintrc(https://github.com/airbnb/javascript/blob/master/linters/.jshintrc)
- JSCS - Airbnb Style Preset (https://github.com/jscs-dev/node-jscs/blob/master/presets/airbnb.json)
其它風格指南
- Google JavaScript Style Guide (http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml)
- jQuery Core Style Guidelines (http://docs.jquery.com/JQuery_Core_Style_Guidelines)
- Principles of Writing Consistent, Idiomatic JavaScript (https://github.com/rwldrn/idiomatic.js/)
- JavaScript Standard Style (https://github.com/feross/standard)
其它風格
- Naming this in nested functions - Christian Johansen (https://gist.github.com/4135065)
- Conditional Callbacks - Ross Allen (https://github.com/airbnb/javascript/issues/52)
- Popular JavaScript Coding Conventions on Github - JeongHoon Byun (http://sideeffect.kr/popularconvention/#javascript)
- Multiple var statements in JavaScript, not superfluous - Ben Alman (http://benalman.com/news/2012/05/multiple-var-statements-javascript/)
進一步閱讀
- Understanding JavaScript Closures - Angus Croll (http://javascriptweblog.wordpress.com/2010/10/25/understanding-javascript-closures/)
- Basic JavaScript for the impatient programmer - Dr. Axel Rauschmayer (http://www.2ality.com/2013/06/basic-javascript.html)
- You Might Not Need jQuery - Zack Bloom & Adam Schwartz (http://youmightnotneedjquery.com/)
- ES6 Features - Luke Hoban (https://github.com/lukehoban/es6features)
- Frontend Guidelines - Benjamin De Cock (https://github.com/bendc/frontend-guidelines)