除了.length属性之外,JavaScript Array和Object之间有什么区别?

时间:2010-07-30 12:20:52

标签: javascript arrays object

我认为,JS数组只是一个哈希映射,只接受整数值作为键。而.length属性只返回最大的索引+ 1。

这是对的吗?还有其他差异吗?

4 个答案:

答案 0 :(得分:3)

你错了;数组可以有你想要的任何键。

此外,他们继承了Array原型。

答案 1 :(得分:1)

JavaScript Array也继承自Object,因此它将获得对象的所有功能。 JavaScript数组有其他功能:

var myA = ['foo', 'bar', 'baz'];
var myO = {0: 'foo', 1: 'bar', 2: 'baz'};

// these both give us "foo":
console.log(myA[0]);
console.log(myO[0]);

// array has additional methods, though:
console.log(myA.pop());
console.log(myO.pop()); // <- error

虽然可以向常规对象添加整数属性并向Arrays添加非整数属性,但这不会为Object提供Array所具有的特殊属性和方法,而Array的特殊功能仅适用于其整数键属性。

对Arrays继承的所有额外属性的一个很好的引用是Mozilla Developer Center article on Array。如果您想保持跨浏览器的兼容性,请务必注意小“非标准”和“需要JavaScript 1.x”注意事项。

答案 2 :(得分:1)

区别在于:

Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call({}); // [object Object]

修改

另外,请参阅ECMAScript规范中的这一部分,因为它准确地解释了数组是什么:http://bclary.com/2004/11/07/#a-15.4

答案 3 :(得分:0)

数组对象可以包含对象可以拥有的任何属性。 唯一的特殊属性是设置“数组索引”属性时(可能)更新的“length”属性,如果设置为低于当前值的值,也可以用于删除数组元素。

“数组索引”是字符串(所有对象属性都是),它是0..2 ^ 32-2范围内无符号整数的规范十进制表示(即“0”到“4294967294”)。 限制是低于32位无符号值的最大值的限制,因为长度字段值始终是无符号的32位整数值。

Array对象也继承自Array.prototype(但如果你愿意,也可以使其它对象也这样做),并且它们的内部类是“Array”。

即,在实践中, Array和普通Object实例之间的唯一区别是“魔法长度属性”。如果你不需要任何东西,你应该只使用一个对象。