我在jsperf测试中看到了一些奇怪的行为。这是设置:
var pro={};
pro._x=3;
var q=Object.create(pro);
q.x=3;
q.z={};
q.z.x=3;
然后,我只需查找每个属性q.x
,q._x
和q.z.x
。
单个查找q.x
比预期的原型查找q._x
更快。但是双重查找q.z.x
是最快的。我预计q.z.x
是最慢的,特别是与q.x
相比时。
q.z.x
甚至比q.z
更快。这是怎么回事?
答案 0 :(得分:1)
使更深层查找更快的事情是,JavaScript引擎能够更好地优化代码以提高性能,因为它确切地知道它正在接收哪个对象。
与使用Object.create
不同,引擎无法执行常规优化周期,使用普通的旧空对象初始化z
对象的q
属性,基本上允许引擎分配适当的内存并相应地为其编制索引。
这段代码var q=Object.create(pro);
基本上告诉JS引擎:“嘿,你得到一个Object
的实例,但我不知道它是什么类型的。可能是一个Array,Objec,RegExp,Date。“,虽然这段代码 - q.z={};
说 - ”嘿,你在这里得到一个Object
对象!确保按照一些内存放置一些内存对于此数据类型“。