JavaScript 之间的区别Array
, and Object
不是很大。事实上看起来Array
主要是添加了length
字段,因此您可以同时使用Array
s and 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 https://en.wikipedia.org/wiki/V8_%28JavaScript_engine%29, JavaScript核心,蜘蛛猴 https://en.wikipedia.org/wiki/SpiderMonkey等),这是如何处理的?显然我们不希望我们的数组实际上存储为带有键值的哈希映射!我们如何才能合理地确定我们的数据存储为实际的数组?
据我所知,引擎可以采取以下几种方法:
-
Array
的实现方式与Object
- 作为带有字符串键的关联数组。
-
Array
是一种特殊情况,具有std::vector
-类似支持数字键的数组,以及一些密度启发式,以防止疯狂的内存使用(如果您这样做)ar[100000000] = 0;
-
Array
是相同的Object
,并且所有对象都会得到启发,看看使用数组是否更有意义。
- 一些我没有想到的极其复杂的事情。
实际上,如果有适当的数组类型,这会更简单(cough WebGL https://en.wikipedia.org/wiki/WebGL类型数组cough).
在 SpiderMonkey 中,数组基本上被实现为 jsval 的 C 数组。这些被称为“密集阵列”。然而,如果你开始对它们做非数组式的事情——比如把它们当作对象——它们的实现就会变成非常类似于对象的东西。
这个故事的寓意是:当你想要一个数组时,就使用数组。当你想要一个对象时,就使用一个对象。
哦,jsval 是一种可变参数类型,它可以表示 64 位 C 类型中任何可能的 JavaScript 值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)