数组是对象

免责声明: 不建议创建类似于数组的对象。但是,了解它们的工作方式很有帮助,尤其是在使用 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