編寫高質量JavaScript的有效方法
1、js的特別之處
- 浮點數計算不精確,應該儘可能轉爲整數進行計算
- 小心強制的類型轉換。
NaN是js中惟一一個不等於自身的值,能夠利用這一點來檢測NaN.
js中的七個假值:false,0,-0,null,undefined,NaN,"".
- 當參數類型不一樣時, == 運算符會對參數用一套難以理解的隱式強制轉換的規則進行轉換,因此應儘可能使用 === 運算符,比較不一樣類型的值時,先進行手動的轉換後在進行比較。
- 分號插入規則
- 分號僅在}標記以前、一個或多個換行以後和程序輸入的結尾插入
- 分後僅在後面的輸入標記不能解析時插入
- for循環頭部var i=0以後必須顯式的插入分號
在return , throw, break, continue, ++ ,-- 的參數以前絕對不能換行,不然會在換行前強制插入分號javascript
若是下一條語句以(, {, +, -. / 開始時,前一行語句不能省略分號,不然會視爲同一行語句執行。java
2、變量做用域
- 閉包的三個特性
- js容許你應用在當前函數外定義的變量
- 即時外部函數已經返回,當前函數仍然能夠引用外部函數中定義的變量
閉包能夠更新外部變量的值api
3、使用函數
- 永遠不要修改arguments對象
- 使用bind方法建立綁定到適當接受者的函數
function bind(fn, context) {
return function() {
return fn.apply(context, arguments);
};
}
- 避免使用函數對象的toString()方法
避免使用非標準的arguments.callee和arguments.callee屬性數組
4、對象和原型
- 使用Object.getPrototypeOf(obj)函數而不是obj._proto_來檢測原型
- 不要修改_proto_屬性
- 使用閉包來存儲私有數據
- 繼承時使用object.create(parent.prototype)來構造子類的原型,以免調用父類的構造函數
- 不要重用父類的屬性名(容易引起衝突)
不要去繼承內置的Array、Function等內置的標準類緩存
5、數組與字典
- 屬性枚舉時使用hasOwnProperty過濾原型屬性,防止原型污染。
爲了不hasOwnProperty被意外覆蓋,能夠預先緩存hasOwn方法或者直接在原型中加入hasOwn方法。
var hasOwn = {}.hasOwnProperty;
- 由於for...in循環沒法保證循環順序,因此用數組而不是字典來存儲有序集合,使用for循環循環數組。
- 絕對不要在Object.prototype中增長可枚舉的屬性
- 不要在枚舉時修改枚舉對象
ES5中Array自帶的foreach,map,filter等方法優於for循環,但若是須要提早終止循環仍是推薦使用傳統的循環。閉包
6、庫和API設計
- 接口設計爲接受關鍵字參數的選項對象,使用extend合併默認參數對象和用戶寫入的參數對象。
- 避免過分的強制轉換,考慮使用防護性監視非預期的輸入。
支持方法鏈.app