JavaScript 中的所有 字符 都是 16 byte 的。
for in 語句會枚舉一個對象的所有屬性名(包括其原型的屬性),通過 Object.hasOwnProperty() 來確定這個屬性名是該對象的成員,還是來自原型鏈。
JavaScript 里的對象是無類型的。對象是屬性的容器,其中每個屬性都擁有名字和值。 屬性名可以是包括空字符串在內的任意字符串。屬性的值可以是除了 undefined 值之外的任何值。
JavaScript 的標識符中包含連接符(-)是不合法的,但允許包含下劃線(_)。所有如果使用 first-name 作屬性名,需要用引號括?。?first-name"。
嘗試從 undefined 的成員屬性中取值將會導致 TypeError 異常??梢酝ㄟ^
flight.equipment && flight.equipment.model來避免。所有通過對象字面量創(chuàng)建的對象都鏈接到 Object.prototype,它是 JavaScript 中的標配對象。
對象字面量產生的對象連接到 Object.prototype。函數對象連接到 Function.prototype (該原型對象本身連接到 Object.prototype)。每個函數在創(chuàng)建時會附加兩個隱藏屬性:函數的上下文和實現(xiàn)函數行為的代碼;一個 prototype 屬性:擁有 constructor 屬性且值為該函數的對象。
-
調用一個函數時,函數會接收兩個附加參數:this 和 arguments。this 的值取決于函數的調用模式。在 JavaScript 中一共有 4 種調用模式:
- 方法調用模式:當一個函數被保存為一個對象的一個屬性時,稱它為 方法。如果調用表達式包含一個提取屬性的動作(即包含一個 . 點表達式或 [] 下標表達式),那么它就是被當作一個方法來調用。
- 函數調用模式:當一個函數并非是一個對象的屬性時,那么它就是被當作一個函數來調用。
- 構造器調用模式:使用 new 來調用函數。(所有構造器函數都約定成首字母大寫的形式,并且不以首字母大寫的形式拼寫任何其他的東西)
- apply 調用模式:funcName.apply('函數被調用時所在的上下文', ['參數數組'])
函數可以通過 arguments 訪問所有它被調用時傳遞給它的參數列表,包括那些沒有被分配給函數聲明時定義的形式參數的多余參數。
閉包是一個函數,該函數可以訪問它被創(chuàng)建時所處的上下文環(huán)境。
級聯(lián):讓方法返回 this 就可以實現(xiàn)級聯(lián)。
記憶:函數可以將先前操作的結果記錄在某個對象里,從而避免無謂的重復運算。例如:
優(yōu)化前:
var fibonacci = function (n) {
return n < 2 ? n : fibonacci (n-1) + fibonacci (n-2);
};
for (var i = 0; i <= 10; i++) {
document.writeln('// ' + i + ':' + fibonacci (i));
}
優(yōu)化后:
var fibonacci = function () {
var memo = [0, 1];
var fib = function (n) {
var result = memo[n];
if( typeof result !== 'number') {
result = fib (n -1) + fib (n - 2);
memo[n] = result;
}
return result;
}
return fib;
}();
JavaScript 沒有數組的數據結構。它提供了一種擁有一些類數組(array-like)特性的 對象。它把數組的下標轉變成字符串,作為屬性。它的屬性的檢索和更新方式和對象一樣,只不過多了一個可以用整數作為其屬性名的特性。
typeof 運算符報告數組的類型是 object。一種判斷一個對象是否是數組的方法:
Object.prototype.toString.apply(arr) === '[object Array']