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

时间:2015-08-03 15:30:41

标签: javascript arrays

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

  

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

为什么?

1 个答案:

答案 0 :(得分:5)

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

var a = [];
a[0] = "foo";
a.notAnIndex = "bar";
console.log(a[0]);         // "foo"
console.log(a.notAnIndex); // "bar"

...并使用对象:

var o = {};
o[0] = "foo";
o.notAnIndex = "bar";
console.log(o[0]);         // "foo"
console.log(o.notAnIndex); // "bar"

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

这是每个规范,以及几年前JavaScript引擎做的。

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

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

更多(在我贫穷的小博客上)A myth of arrays

我没有进入数组与链接列表问题,因为,Bergi says,它实际上是一个单独的问题,而且这是在SO上的多个问题中解决的问题,例如{{3} },this onethis one和其他许多人。