javascript - 为什么检查 void 0 比检查 undefined 快得多?

标签 javascript performance

在我的串联 javascript 上使用 gulp-uglify 后,我注意到一些有趣的事情。我将 undefined 传递给全局 IIFE 包装器,我看到它正在将其更改为 void 0。 void 0 是什么鬼?我在控制台中运行它,它返回未定义。有趣的!这让我很好奇,所以我开始在 void 0 上运行测试。在我的控制台测试(简单循环和时间戳)中,我观察到速度提高了 180 倍,具体取决于浏览器,检查 void 0而不是 undefined。有谁知道为什么检查 void 0 如此快?

(function(start, x, z){
    for (var i=0; i<z; i++){
      if (x === undefined){}
    }
    console.info('t1 ', Date.now() - start);
    start = Date.now();
    for (var i=0; i<z; i++){
      if (x === void 0){}
    }
    console.info('t1 ', Date.now() - start);
})(Date.now(), '', 1e6)

最佳答案

其实,我刚刚才意识到void 0undefined的区别。 undefined 是一个全局范围的值,void 是一个运算符。此测试中发生的事情是全局检查 undefined 而 void 0,因为它是一个使用运算符 void 的表达式,不需要范围遍历来检查它的值(value)。如果将 undefined 传递给 IIFE 包装器,测试结果将相同。原始测试中显示的性能差异实际上仅测量了范围遍历 1e6 次的时间成本。

进一步的代码证明是这样的。下面的 for 循环具有相同的执行时间:

(function(start, x, z, undefined, c, Math){
    for (var i=0; i<z; i++){
    if (x !== undefined){
        c = Math.random();
    }
    }
    console.info('t1 ', Date.now() - start);
    start = Date.now();
    c = 0;
    for (var i=0; i<z; i++){
        if (x !== void 0){
            c = Math.random();
        }
    }
    console.info('t1 ', Date.now() - start);
})(Date.now(), '', 1e6, undefined, 0, Math)

rock star确实指出了一个很好的观点,即结果取决于代码的编写方式,例如是否访问内存中有条件分配的值。根据我的测试,如果您获取值并将其作为参数传递给函数,结果会有很大差异。在这一点上,浏览器可能会决定做更少的优化。尽管如此,在我运行的每个测试中,void 0 仍然比 undefined 更快或等效,使用更少的 kb,并且消除了对遍历范围的担忧。

关于javascript - 为什么检查 void 0 比检查 undefined 快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47555979/

相关文章:

performance - magento 编译模式 vs apc

javascript - 获取被点击的<a>的DOM路径

javascript - jQuery UI 1.9 选项卡中的多个 show() 和 hide() 效果

javascript - 调整 div 大小以填充浏览器

python - 以 numpy 数组为参数的 Cython 内联函数

mysql - MYSQL、MAX( IF( 条件 ) ) 或子查询条件中的性能

asp.net-mvc - 渲染 View 时 ASP.NET MVC 4 很慢

javascript - Titanium:平台检测并相应地改变界面风格

javascript - 在MongoDB原生的NodeJS Driver中,什么时候使用MongoClient构造函数,什么时候使用Db构造函数?

r - 是否有比 Base R 中的 expand.grid 更快的配对比较方法?