Array
JavaScript和JavaScript 之间的区别Object
并不是很大。实际上它似乎Array
主要是添加length
字段,因此您可以将Array
s 和Object
s 用作数字数组:
var ar = new Array();
ar[0] = "foo";
ar["bar"] = "foo";
var ob = new Object();
ob[0] = "foo";
ob["bar"] = "foo";
assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true.
所以我的问题是,在流行的 JavaScript 引擎(V8、JavaScriptCore、SpiderMonkey等)中,这是如何处理的?显然,我们不希望我们的数组实际存储为带有键值的哈希映射!我们如何合理地确定我们的数据存储为实际数组?
据我所知,引擎可以采取以下几种方法:
Array
Object
实现方式与- 作为具有字符串键的关联数组完全相同。Array
是一种特殊情况,有一个类似std::vector
- 的数组支持数字键,如果你这样做,一些密度启发式可以防止疯狂的内存使用ar[100000000] = 0;
Array
与 相同Object
,并且所有对象都会得到启发,以查看使用数组是否更有意义。- 我没有想到的疯狂复杂的事情。
如果有适当的数组类型(咳嗽 WebGL类型数组咳嗽),这确实会更简单。