for-in vs Object.key forEach没有继承属性

maj*_*rif 29 javascript inheritance

我正在寻找Object.keys+ forEachvs for-in普通物体的性能指标.

这个基准表明,Object.keys+ forEach慢62%for-in的方法.但是,如果您不想获得继承的属性呢?for-in包括所有非本地继承对象,因此我们必须使用hasOwnProperty来检查.

我试着在这里做另一个基准测试.但现在这种for-in方法比+ 41%.Object.keysforEach


更新

上述测试是在Chrome中完成的.再次测试,但使用Safari,我得到了不同的结果:Object.keys(..).forEach(..) 34% slower奇怪.

注意:我进行基准测试的原因是检查它与Node.js的关系.

问题:

  • Chromejsperf结果对Node.js来说是否相当可观?
  • 发生了什么事,怎么来进行的单一条件for-in的方法要慢41%,Object.keys+ forEach镀铬

Max*_*Art 31

node.js使用V8,虽然我猜它与Chrome中的当前版本不一样,但我想这是节点在这个主题上表现的一个很好的指标.

其次,你正在使用forEach,这在开发时非常方便,但为每次迭代添加了一个回调,这是一个(相对)长度的任务.所以,如果你对表演感兴趣,为什么不用普通的for循环呢?

for (var i = 0, keys = Object.keys(object); i < keys.length; i++) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这样可以获得最佳性能,也可以解决Safari中的速度问题.

简而言之:它不是有条件的,而是对它的呼唤hasOwnProperty有所作为.你在每次迭代时都在进行函数调用,这就是为什么for...in变慢.


Jea*_*ert 17

请注意:

var keys = Object.keys(obj), i = keys.length;

while(--i) {
   //
}
Run Code Online (Sandbox Code Playgroud)

不会为索引0运行,然后你会错过你的一个属性.

这个像["a","b","c","d"]这样的数组只会运行d,c,b,你会错过"a"'因为索引是0而0是假的.

你需要在检查后减少:

var keys = Object.keys(obj), i = keys.length;

while(i--) {
   //
}
Run Code Online (Sandbox Code Playgroud)