Javascript数组比C++中的数组效率低

vlt*_*lt5 1 javascript arrays

我正在读一本关于JS数据结构的书,它提到:

javascript中的数组被实现为对象,导致它们比使用其他语言(如C++和Java)构建的数组效率低.

为什么?

T.J*_*der 5

在规范中,JavaScript的Array类型被定义为一个对象(不是真正的连续内存数组),特殊处理某些类型的属性名称,规范称为"索引",特定的原型(Array.prototype)和length具有行为的属性不只是存储你放入它的价值.根据规范,使用数组之间没什么区别:

var a = [];
a[0] = "foo";
a.notAnIndex = "bar";
console.log(a[0]);         // "foo"
console.log(a.notAnIndex); // "bar"
Run Code Online (Sandbox Code Playgroud)

......并使用一个对象:

var o = {};
o[0] = "foo";
o.notAnIndex = "bar";
console.log(o[0]);         // "foo"
console.log(o.notAnIndex); // "bar"
Run Code Online (Sandbox Code Playgroud)

...当然,除了对象将具有不同的原型并且不具有特殊length属性.根据规范,即使在a[0]上面,0也会转换为string("0"),然后查找具有该名称的属性以获取值.

这是每个规范,以及几年前JavaScript引擎做了什么.

如果可能的话,现代JavaScript引擎会尝试使用真正的连续内存数组,如果它看起来像是代码如何使用数组,必要时会回到字典(对象).聪明,这些JS引擎编写者.:-)

现在,JavaScript还有其他类型的数组,称为类型数组,例如Int32Array,它们是真正的数组而不是字典.

更多(在我贫血的小博客上):阵列的神话


我没有进入数组与链接列表问题,因为正如Bergi所说,它实际上是一个单独的问题,而且它是在SO上的多个问题中得到解决的,例如这个,这个,这个,和很多其他的.