【问题标题】:Why Are Array-Like Objects Used in Javascript Over Native Arrays为什么在 JavaScript 中使用类数组对象而不是原生数组
【发布时间】:2010-11-22 00:30:20
【问题描述】:

在 Javascript 中很常见的 Array-Like 对象与 Array 类型的构建有一些相似之处,但没有它的所有方法或特性。如此之多,以至于有一些技巧可以将类数组对象转换为“真实”数组以进行进一步操作。

Javascript: The Definitive Guide 中甚至提到了这一点。

问题是为什么这种模式如此普遍?为什么不在所有这些情况下都选择内置的 Array 类型呢?

【问题讨论】:

  • 可能是相关问题:stackoverflow.com/questions/1971389/…
  • 例如:arguments 被设计为不可变的。如果它是一个数组,情况就不是这样了。
  • @elusive,arguments 对象是可变的,你可以改变它的属性值。以索引命名的属性链接到函数的FormalParameters,如果您更改arguments[0] 的值,更改将反映在函数的第一个命名参数上。 ECMAScript 5 上的严格模式,引入了一些限制,但对象仍然是可变的。
  • @CMS:你是对的。这里弄错了。早上非常。顺便说一句,很好的答案。 +1!

标签: javascript arrays


【解决方案1】:

嗯,说到 core Javascript 对象,arguments 是一个很好的例子。

在这种情况下,它从一开始就是一个类数组对象,在 ECMAScript 第 1 版规范中已经作为一个简单对象出现。

为什么?我想当时只有四个内置的Array方法,可能设计者认为不值得,后来提出了改变,但微软(TC39委员会的一部分)没有批准变化,对破坏网络的恐惧一直存在。

现在要托管对象,我想到了DOM,NodeLists,我认为由于这些对象的动态行为,他们不想使用本机Array 类型。

NodeLists 一般是 live 对象,它们的结构反映了底层 DOM 结构的任何变化...

我个人喜欢数组对象,因为它们真的很轻量级,在 ECMAScript 5 之前,核心方法有很多限制,关于用户定义的类数组对象的使用。

例如,函数对象的 apply 方法,在 ECMAScript

var arrayLike = {0: 'hello ', 1:'world', length:2};
(function (a,b) { alert(a+b); }).apply(null, arrayLike);

另见:

【讨论】:

  • 我怀疑将arguments 转换为Array 的主要反对意见是它会利用arguments 比现在更难进行优化.
  • @Gabe:嗯,在 ES5 被接受之前的最后一次讨论中,优化不是问题,问题是向后兼容性,特别是 toStringtoLocaleString 方法。更改甚至达到了草稿状态,但并不是很直接,他们使用了Array 对象,但定义了两个自己的属性(toStringtoLocaleString)指向Object.prototype 上的方法。一段时间后,该更改从 ES5 草案中退出。最后在ES5严格模式下解决了arguments对象的优化问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
  • 2011-10-06
  • 1970-01-01
  • 2010-10-15
  • 2019-04-14
相关资源
最近更新 更多