【问题标题】:What's the difference between JavaScript Array and Object except .length property?JavaScript Array 和 Object 除了 .length 属性有什么区别?
【发布时间】:2010-07-30 12:20:52
【问题描述】:

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

这是对的吗?还有其他区别吗?

【问题讨论】:

  • 你是说[]{}的区别吗?
  • 不。与语法无关。我说的是行为和实现。

标签: javascript arrays object


【解决方案1】:

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

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

【讨论】:

  • 好吧,我不会说数组可以有任何键。我认为整数键被以一种特殊的方式处理,而如果你使用另一个键,比如一个字符串,你只是利用了一个数组也只是一个对象的事实。正如 OP 已经说过的那样,Array.length 反映了这一点。
  • @Felix:整数键唯一可见的特殊处理是length 属性。尽管实现可以优化整数键的使用,但这种优化必须没有副作用。
  • 因此,将 Array 视为 hash-map 的特例似乎是安全的。
【解决方案2】:

区别在于:

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

编辑:

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

【讨论】:

  • 只是我找到的信息。现在我可以将 Array 视为一个 has-table,而不是 C 样式的数组。谢谢。
【解决方案3】:

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”的小注释。

【讨论】:

  • myO.pop = function() { return "ne ne ne ne, I can pop too!" }; - 给你,一个具有完美工作.pop()的对象(不是数组)。您的代码不能证明任何事情。
【解决方案4】:

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

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

Array 对象也继承自 Array.prototype(但如果需要,您也可以创建其他对象)并且它们的内部类是“Array”。

即,实际上, Array 和普通 Object 实例之间的唯一区别是“神奇的长度属性”。如果你不需要它来做任何事情,你应该只使用一个对象。

【讨论】:

  • myObject.length = function() { return 12 }; - 酷,我现在是一个数组。再说一遍 - 你的帖子并不能证明任何事情,你所说的完全是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2016-12-03
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
相关资源
最近更新 更多