陣列是物件
免責宣告: 不建議建立類似於陣列的物件。但是,瞭解它們的工作方式很有幫助,尤其是在使用 DOM 時。這將解釋為什麼常規陣列操作不適用於從許多 DOM
document
函式返回的 DOM 物件。 (即querySelectorAll
,form.elements
)
假設我們建立了以下物件,該物件具有你希望在 Array 中看到的某些屬性。
var anObject = {
foo: 'bar',
length: 'interesting',
'0': 'zero!',
'1': 'one!'
};
然後我們將建立一個陣列。
var anArray = ['zero.', 'one.'];
現在,請注意我們如何以相同的方式檢查物件和陣列。
console.log(anArray[0], anObject[0]); // outputs: zero. zero!
console.log(anArray[1], anObject[1]); // outputs: one. one!
console.log(anArray.length, anObject.length); // outputs: 2 interesting
console.log(anArray.foo, anObject.foo); // outputs: undefined bar
由於 anArray
實際上是一個物件,就像 anObject
一樣,我們甚至可以為 anArray
新增自定義的羅嗦屬性
免責宣告: 通常不建議使用具有自定義屬性的陣列,因為它們可能會造成混淆,但在需要 Array 優化功能的高階情況下,它可能很有用。 (即 jQuery 物件)
anArray.foo = 'it works!';
console.log(anArray.foo);
我們甚至可以通過新增 length
使 anObject
成為類似於陣列的物件。
anObject.length = 2;
然後你就可以使用 C 風格的 for
迴圈迭代 anObject
,就像它是一個陣列一樣。請參見陣列迭代
請注意,anObject
只是一個類似於陣列的物件。 (也稱為 List)它不是真正的陣列。這很重要,因為像 push
和 forEach
(或者 Array.prototype
中的任何便利功能)這樣的函式在類似陣列的物件上預設不起作用。
許多 DOM document
函式將返回一個 List(即 querySelectorAll
,form.elements
),它類似於我們在上面建立的類似陣列的 anObject
。請參閱將類陣列物件轉換為陣列
console.log(typeof anArray == 'object', typeof anObject == 'object'); // outputs: true true
console.log(anArray instanceof Object, anObject instanceof Object); // outputs: true true
console.log(anArray instanceof Array, anObject instanceof Array); // outputs: true false
console.log(Array.isArray(anArray), Array.isArray(anObject)); // outputs: true false