javascript Arrays实际上是作为数组实现的吗?

Tim*_*mmm 19 javascript arrays performance v8 spidermonkey

javascript之间的区别Array,Object并不是很大.实际上它似乎Array主要添加了length字段,因此您可以将Arrays和Objects用作数字数组:

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.
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,在流行的JavaScript引擎(V8,JavaScriptCore,SpiderMonkey等)中,这是如何处理的?显然,我们不希望我们的数组实际存储为具有键值的哈希映射!我们怎样才能合理地确定我们的数据是否存储为实际数组?

据我所知,引擎可以采取一些方法:

  1. Array实现方式与Object- 使用字符串键的关联数组完全相同.
  2. Array是一个特殊情况,一个std::vector支持数字键的类似数组,以及一些密度启发式,以防止疯狂的内存使用ar[100000000] = 0;
  3. Array是相同的Object,并且所有对象都获得启发式,以查看使用数组是否更有意义.
  4. 我没有想到的东西非常复杂.

如果有一个合适的阵列类型(咳嗽 WebGL类型阵列咳嗽),这真的会更简单.

Wes*_*Wes 13

在SpiderMonkey中,数组基本上是作为jsvals的C数组实现的.这些被称为"密集阵列".但是,如果你开始对它们做类似非数组的事情 - 比如像对象一样对待它们 - 它们的实现就会变成非常类似于对象的东西.

故事的道德:当你想要一个数组时,使用一个数组.如果需要对象,请使用对象.

哦,jsval是一种可变参数类型,可以表示64位C类型中任何可能的JavaScript值.


gsn*_*ers 7

在V8和Carakan(可能是Chakra)中,所有(非主机)对象(包括数组和非数组)都具有名称为数组索引的属性(在ES5中定义)存储为密集数组(包含一些值包装器的C数组)或稀疏数组(实现为二叉搜索树).

统一对象表示通过显示它影响枚举顺序:对于一个对象,SpiderMonkey和SquirrelFish都按插入顺序给出所有属性; 并且使用数组,它们通常(至少在SM中有特殊情况!)数组索引首先是插入顺序中的所有其他属性.无论对象类型如何,V8,Carakan和Chakra总是以插入顺序首先给出数组索引,然后是所有其他属性.

  • 感谢您提供信息,但来源是什么? (3认同)