【发布时间】:2010-07-30 12:20:52
【问题描述】:
我认为,JS 数组只是一个哈希映射,它只接受整数值作为键。 .length 属性只返回最大索引 + 1。
这是对的吗?还有其他区别吗?
【问题讨论】:
-
你是说
[]和{}的区别吗? -
不。与语法无关。我说的是行为和实现。
标签: javascript arrays object
我认为,JS 数组只是一个哈希映射,它只接受整数值作为键。 .length 属性只返回最大索引 + 1。
这是对的吗?还有其他区别吗?
【问题讨论】:
[]和{}的区别吗?
标签: javascript arrays object
你错了;数组可以有任何你想要的键。
此外,它们继承了 Array 原型。
【讨论】:
Array.length 反映了这一点。
length 属性。尽管实现可以优化整数键的使用,但这种优化必须没有副作用。
区别在于:
Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call({}); // [object Object]
编辑:
另外,请查看 ECMAScript 规范中的这一部分,因为它准确地解释了数组是什么:http://bclary.com/2004/11/07/#a-15.4
【讨论】:
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
虽然您可以将整数属性添加到常规对象并将非整数属性添加到数组,但这不会为对象提供 Array 具有的特殊属性和方法,并且 Array 的特殊功能仅适用于其整数键属性。
数组继承的所有额外属性的一个很好的参考是Mozilla Developer Center article on Array。如果您想保持跨浏览器兼容性,请务必注意“非标准”和“需要 JavaScript 1.x”的小注释。
【讨论】:
数组对象可以具有对象可以具有的任何属性。 唯一的特殊属性是“长度”属性,当您设置“数组索引”属性时(可能)会更新,如果设置为比当前值更低的值,它也可用于删除数组元素。
“数组索引”是字符串(所有对象属性都是),它是 0..2^32-2 范围内的无符号整数的规范十进制表示(即“0”到“4294967294”)。 该限制低于 32 位无符号值的最大值,因为长度字段值始终是无符号 32 位整数值。
Array 对象也继承自 Array.prototype(但如果需要,您也可以创建其他对象)并且它们的内部类是“Array”。
即,实际上, Array 和普通 Object 实例之间的唯一区别是“神奇的长度属性”。如果你不需要它来做任何事情,你应该只使用一个对象。
【讨论】: