陣列是物件

免責宣告: 不建議建立類似於陣列的物件。但是,瞭解它們的工作方式很有幫助,尤其是在使用 DOM 時。這將解釋為什麼常規陣列操作不適用於從許多 DOM document 函式返回的 DOM 物件。 (即 querySelectorAllform.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)它不是真正的陣列。這很重要,因為像 pushforEach(或者 Array.prototype 中的任何便利功能)這樣的函式在類似陣列的物件上預設不起作用。

許多 DOM document 函式將返回一個 List(即 querySelectorAllform.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