Reference: JavaScript - The Definitive Guide Chapter 6, Chapter 7
for/in loop: (section 6.9)
with 指令會暫時改變 scope chain,雖然程式碼比較好寫,但執行效率會變差,盡量不要用。(section 6.18)
當 object 用 obj["prop"] 來存取時,"prop"可以做 string 的操作,例如 obj["prop"+i] 動態決定要存取什麼屬性。如果用 obj.prop 的寫法,則 prop 當然是寫死的文字。這就是兩種 object 存取方式的差別。(section 7.3)
所有自訂的 object 屬性都是 enumerable 的 (ie. 可使用 for/in loop 存取);Nonenumerable 屬性指的是繼承 Object class 來的那些屬性。所以 propertyIsEnumerable()(某自訂屬性是否 enumerable) 得到的結果幾乎會跟 hasOwnProperty() (是否有某個自訂屬性)一樣。(section 7.4)
delete 指令對 Array 元素的作用是讓它變成 undefine,實際上該元素還是會在。Array.shift()、Array.pop()、跟 Array.splice() 才是真正會刪除某個元素,並且平移其他元素的指令。(section 7.6)
Array 的 length 這個屬性永遠是當前最高位元素的 index+1,無論之間的內容是不是連續的。例如宣告 a[0] = 1; a[49] = 100; 則 a.length = 50。(section 7.6)
length 是一個可設定的值,假如新的值比原本小,那多的元素就會被丟掉;假如比原本大,會塞一些 undefined 元素到 array 中。 (section 7.6)
雖然 object 可以用 obj[0] = value; 這種類似 array 的方式存取,但那也只是「新增加一個名字為 0 的屬性」而已,跟 array 還是不同,當然也不會有 length 這個屬性。(section 7.6)
Array 的 sort() 會依照「字母順序」排序元素,無論元素的型態是什麼。如果想要自訂排序方式,可以傳一個比較函數給它,例如這樣:(section 7.7)
Array 的 concat() 函數把參數中的值加到原本 array 的最後面,並回傳。如果參數內給的也是 array,那第一層會被拆掉。例如下面這樣:(section 7.7)
slice() 會回傳原本 array 中參數指定的部份。參數可以用負數表示從最後一個元素的相對位置,例如 -3 表示從後面數來第三個。
splice() 可以新增或刪除 array 元素,並且平移其他元素讓整個 array 還是連續的。而且它是直接作用在呼叫的 array 上面,回傳切下來的部份。第一個參數表示起始index,第二個參數(省略則直接到最後)表示作用的數目,第三個以後的參數表示要加上去的新元素。直接看例子:(section 7.7)
- 可以動態改變指定的 variable,例如下面這段程式碼複製 obj 的所有屬性名稱到 arr 中。
var obj = {x:1, y:2, z:3}; var arr = new Array( ); var i = 0; for(arr[i++] in obj) /* empty loop body */;
- for/in 存取 property 並沒有依照某個順序,完全是 implementation-dependent,所以在 loop 中新增/刪除某個 property 要好好考慮。
var a = [33, 4, 1111, 222]; a.sort(); // Alphabetical order: 1111, 222, 33, 4 a.sort(function(a,b) { // Numerical order: 4, 33, 222, 1111 return a-b; // Returns < 0, 0, or > 0, depending on order });
var a = [1,2,3]; a.concat(4, 5) // Returns [1,2,3,4,5] a.concat([4,5]); // Returns [1,2,3,4,5] a.concat([4,5],[6,7]) // Returns [1,2,3,4,5,6,7] a.concat(4, [5,[6,7]]) // Returns [1,2,3,4,5,[6,7]]
var a = [1,2,3,4,5,6,7,8]; a.splice(4); // Returns [5,6,7,8]; a is [1,2,3,4] a.splice(1,2); // Returns [2,3]; a is [1,4] a.splice(1,1); // Returns [4]; a is [1] var a = [1,2,3,4,5]; a.splice(2,0,'a','b'); // Returns []; a is [1,2,'a','b',3,4,5] a.splice(2,2,[1,2],3); // Returns ['a','b']; a is [1,2,[1,2],3,3,4,5]