16

我在jsperf测试中看到一些奇怪的行为。这是设置:

var pro={};
pro._x=3;
var q=Object.create(pro);
q.x=3;
q.z={};
q.z.x=3;

然后我只需查找每个属性q.xq._xq.z.x

单次查找q.xq._x预期的原型查找要快。但是双重查找q.z.x是最快的。我预计q.z.x会是最慢的,尤其是与q.x.

q.z.x甚至比q.z. 这里发生了什么?

4

1 回答 1

1

JavaScript 引擎能够更好地优化代码以提高性能,因为它确切地知道它正在接收什么对象,这使得更深层次的查找变得更快。

与 using 不同Object.create,引擎无法执行其常规优化周期,使用普通的旧空对象来初始化对象的z属性q,基本上允许引擎分配适当的内存并相应地对其进行索引。

这段代码var q=Object.create(pro);基本上告诉 JS 引擎:“嘿,你得到了一个 an 的实例,Object但我不知道它是什么类型。可能是 Array、Objec、RegExp、Date。”,而这段代码——q.z={};说——“嘿,你在Object这里得到一个对象!确保根据这个数据类型留出一些内存”。

于 2015-05-13T13:46:38.093 回答