JavaScript 學習筆記
1、進行比較時,盡量使用“===”,而不是使用“==”,因為“==”操作符會為了比較兩個值而進行強制類型轉換,會帶來效能消耗。
2、為了達到遍曆數組的最佳效能,推薦使用經典的 for 迴圈。
var list = [1, 2, 3, 4, 5, ...... 100000000];
for(var i = 0, l = list.length; i < l; i++) {
console.log(list[i]);
}
上面代碼有一個處理,就是通過 l = list.length 來緩衝數組的長度。
雖然 length 是數組的一個屬性,但是在每次迴圈中訪問它還是有效能開銷。 可能最新的 JavaScript 引擎在這點上做了最佳化,但是我們沒法保證自己的代碼是否運行在這些最近的引擎之上。
實際上,不使用緩衝數組長度的方式比緩衝版本要慢很多。
3、使用var array=[] 來聲明數組。代碼易讀性更高,減少可能發生的錯誤。
4、隱式的全域變數
// 指令碼 A
foo = '42';
// 指令碼 B
var foo = '42'
上面兩段指令碼效果不同。指令碼 A 在全域範圍內定義了變數 foo,而指令碼 B 在當前範圍內定義變數 foo。所以聲明變數時都要使用var,防止莫名其妙的bug。
5、JavaScript 中每個函數內都能訪問一個特別變數 arguments。這個變數維護著所有傳遞到這個函數中的參數列表。注意: 由於 arguments 已經被定義為函數內的一個變數。 因此通過 var 關鍵字定義 arguments 或者將 arguments 聲明為一個形式參數, 都將導致原生的 arguments 不會被建立。arguments 變數不是一個數組(Array)。 儘管在文法上它有數組相關的屬性 length,但它不從 Array.prototype 繼承,實際上它是一個對象。
6、
閉包意味著當前範圍總是能夠訪問外部範圍中的變數。 因為 函數 是 JavaScript 中唯一擁有自身範圍的結構,因此閉包的建立依賴於函數。它可以類比私人變數
function Counter(start) {
var count = start;
return {
increment: function() {
count++;
},
get: function() {
return count;
}
}
}
var foo = Counter(4);
foo.increment();
foo.get(); // 5
這裡,Counter 函數返回兩個閉包,函數 increment 和函數 get。 這兩個函數都維持著 對外部範圍 Counter 的引用,因此總可以訪問此範圍內定義的變數 count.
7、為了不使用全域變數和讓程式模組化,在Javascript中有一種方法:使用匿名封裝器來建立命名空間
(function() {
// 函數建立一個命名空間
window.foo = function() {
// 對外公開的函數,建立了閉包
};
})(); // 立即執行此匿名函數
匿名函數被認為是 運算式;因此為了可調用性,它們首先會被執行。
( // 小括弧內的函數首先被執行
function() {}
) // 並且返回函數對象
() // 調用上面的執行結果,也就是函數對象
有一些其他的調用函數運算式的方法,比如下面的兩種方式文法不同,但是效果一模一樣。
// 另外兩種方式
+function(){}();
(function(){}());
8、絕對不要省略分號,同時也提倡將花括弧和相應的運算式放在一行, 對於只有一行代碼的 if 或者 else 運算式,也不應該省略花括弧。 這些良好的編程習慣不僅可以提到代碼的一致性,而且可以防止解析器改變程式碼為的錯誤處理。如果代碼在需要分號的地方沒有寫分號,解析器會自動插入分號,有可能會改變代碼。
9、call是function的內建方法,用法:obj1.method1.call(obj2,argument1,argument2)
如上,call的作用就是把obj1的方法放到obj2上使用,後面的argument1..這些做為參數傳入。apply的作用和call是相同的,但是apply參數要以數組的形式傳遞,所以當參數明確時可用call, 當參數不明確時可用apply給合arguments 。如
print.call(window, "背" , "光" , "腳", "本");
print.apply(window, arguments);