我是Javascript的新手,并注意到您不需要指定数组的大小,并且经常看到人们一次动态创建数组元素。这将是其他语言中的一个巨大的性能问题,因为随着它的大小增加,您将不断需要为该阵列重新分配内存。
这不是JavaScript的问题吗?如果是,那么是否有可用的列表结构?
答案 0 :(得分:16)
很可能取决于您使用的JavaScript引擎。
Internet Explorer使用稀疏数组和密集数组的混合来实现这一点。这里解释了一些更加血腥的细节:http://blogs.msdn.com/b/jscript/archive/2008/04/08/performance-optimization-of-arrays-part-ii.aspx。
答案 1 :(得分:16)
Javascript数组通常实现为哈希映射(就像Javascript对象一样),但有一个附加功能:有一个属性length
,它比已用作密钥的最高正整数高一个。使用字符串,浮点数,甚至是负数作为键,还都没有阻止你。除了好感之外没什么。
答案 2 :(得分:9)
关于动态语言的事情是,它们是动态的。就像Java中的ArrayList或Perl,PHP和Python中的数组一样,JavaScript中的数组将分配一定量的内存,当它变得太大时,语言会自动附加到对象上。它是否像C ++甚至Java一样高效?不(C ++可以围绕JS的最佳实现运行),但是人们并没有在JS中构建Quake(仅此而已)。
实际上,最好将它们视为具有一些专门方法的HashMaps - 毕竟,这是有效的:var a = []; a['cat']='meow';
。
答案 3 :(得分:5)
没有
JavaScript数组是什么和不是由语言规范特定部分15.4确定。 Array
是根据它提供的操作定义的,而不是任何特定数据结构的内存布局的实现细节。
可以在链接列表之上实现Array
吗?是。这可能会使某些操作更快,例如shift
和unshift
效率更高,但Array
也经常被索引访问,而这对链接列表效率不高。
在没有链接列表的情况下,也可以获得两全其美的效果。诸如circular queues之类的连续内存数据结构既可以从前端有效插入/删除,也可以有效地随机访问。
实际上,大多数解释器通过使用基于类似于C ++ vector
或Java ArrayList
的可调整大小或可重新分配的数组的数据结构来优化密集数组。
答案 4 :(得分:4)
它们实际上更像是使用属性作为索引的自定义对象。 例如:
var a = { "1": 1, "2": 2};
a.length = 2;
for(var i=0;i<a.length;i++)
console.log(a[i]);
a
的行为几乎就像一个数组,你也可以通过它调用Array.prototype中的函数。
答案 5 :(得分:3)
Javascript数组不是像C / C ++或其他语言那样的真正数组。因此,它们不是那么有效,但它们可以说更容易使用,并且不会抛出异常的例外。