我正在读一本关于JS数据结构的书,它提到:
javascript中的数组实现为对象,导致它们的效率低于使用其他语言(如C ++和Java)构建的数组。
为什么?
答案 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 one,this one和其他许多人。