一、變量
- 全局變量
JavaScript的兩個特征,不自覺地創建出全局變量是出乎意料的容易。首先,你可以甚至不需要聲明就可以使用變量;第二,JavaScript有隱含的全局概念,意味着你不聲明的任何變量都會成為一個全局對象屬性(不是真正意義上的全局變量,可以用delete刪除)
function sum(x,y) { // result 未聲明,為隱式全局變量 result = x + y; return result; }
function foo() { // 使用任務鏈進行部分var聲明,b為隱式全局變量 var a = b = 1; }
建議:
function (x,y) { var a ,b ; a = b = 1;//a,b 為局部變量 }
- var作用
通過var創建的全局變量(任何函數之外的程序中創建)是不能被刪除的。無var創建的隱式全局變量(無視是否在函數中創建)是能被刪除的。
// 定義三個全局變量 var global_var = 1; global_novar = 2; // 反面教材 (function () { global_fromfunc = 3; // 反面教材 }()); // 試圖刪除 delete global_var; // false delete global_novar; // true delete global_fromfunc; // true // 測試該刪除 typeof global_var; // "number" typeof global_novar; // "undefined" typeof global_fromfunc; // "undefined"
- 單var形式聲明變量
在函數頂部使用單var語句是比較有用的一種形式。所有未初始化但聲明的變量的初始值是undefined
function func() { var a = 1, b = 2, sum = a + b, myobject = {}, i, j; // function body... }
- var散布問題
// 反例 myname = "global"; // 全局變量 function func() { alert(myname); //"undefined"
var myname = "local"; alert(myname); // "local"
}
func();
等同於:
myname = "global"; // global variable function func() { var myname; // 等同於 -> var myname = undefined; alert(myname); // "undefined" myname = "local"; alert(myname); // "local"} func();
二 for循環
- 建議使用
function looper() { var i = 0, max, myarray = []; // ... for (i = 0, max = myarray.length; i < max; i++) { // 使用myarray[i]做點什么 } }
使用以下表達式代替i++
i = i + 1
i += 1
以下兩種循環方式更快
//第一種變化的形式: var i, myarray = []; for (i = myarray.length; i–-;) { // 使用myarray[i]做點什么 } //第二種使用while循環: var myarray = [], i = myarray.length; while (i–-) { // 使用myarray[i]做點什么 }
- for-in循環
應用在非數組對象的遍歷上,數組使用正常的for循環,對象使用for-in循環。使用hasOwnProperty()
方法,當遍歷對象屬性的時候可以過濾掉從原型鏈上下來的屬性。
三 避免隱式類型轉換
- 堅持使用===和!==
四 避免使用eval,以及避免給setInterval(), setTimeout()和Function()構造函數傳遞字符串,用函數代替。
五 parseInt()數值轉換
建議給基數參數賦值,
var month = "06", year = "09"; month = parseInt(month, 10);//開頭為0的字符串會被當做8進制處理 year = parseInt(year, 10);
六 編程規范
構造函數命名:MyConstructor();
一般函數命名:myFunction();
變量命名:firstName;
私有屬性或方法:_secondeName,
常量:PI,MAX;