为什么在Javascript中使用类似于数组的对象而不是本机数组

Pau*_*son 12 javascript arrays

在Javascript中很常见的是类似于Array的对象,它与Array类型的构建有一些相似之处,但没有它的所有方法或功能.因此,有一些技巧可以将类似Array的对象转换为"真正的"数组以进行进一步操作.

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

问题是为什么这种模式如此常见?在所有这些情况下,为什么不更喜欢内置的Array类型呢?

CMS*_*CMS 7

好吧,谈到核心 Javascript对象,这arguments是一个很好的例子.

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

为什么?我认为当时只有四种内置Array方法,也许设计师并不认为它过多,后来提出了改变,但微软(TC39委员会的一部分)没有批准改变,害怕打破网络一直存在.

现在我想到主机对象 DOM,NodeLists我认为Array由于这些对象的动态行为,我们不想使用本机类型.

NodeLists通常是活动对象,它们的结构反映了底层DOM结构的任何变化......

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

例如,apply在ECMAScript <= 3中,函数对象的方法只允许实数数组或参数对象作为其第二个参数,现在在ES5中,以下是可能的:

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

也可以看看:

  • @Gabe:嗯,在ES5被接受之前的最后一次讨论中,优化不是问题,问题是向后兼容,特别是与`toString`和`toLocaleString`方法.变化甚至达到了草稿状态,但实际上并不是直接的,他们使用了一个`Array`对象,但定义了两个自己的属性(`toString`和`toLocaleString`)指向`Object.prototype'上的方法. .一段时间后,ES5草案中的更改被删除了.最后,在ES5严格模式下解决了关于`arguments`对象的优化问题. (2认同)