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