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

 乐橙味_367 发布于 2022-12-31 13:09

我正在寻找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镀铬

MaxArt.. 31

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

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

for (var i = 0, keys = Object.keys(object); i < keys.length; i++) {
    // ...
}

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

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

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

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

    for (var i = 0, keys = Object.keys(object); i < keys.length; i++) {
        // ...
    }
    

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

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

    2022-12-31 13:10 回答
  • 请注意:

    var keys = Object.keys(obj), i = keys.length;
    
    while(--i) {
       //
    }
    

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

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

    你需要在检查后减少:

    var keys = Object.keys(obj), i = keys.length;
    
    while(i--) {
       //
    }
    

    2022-12-31 13:10 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有