繁体   English   中英

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

[英]Why is checking void 0 so much faster than checking undefined?

在我的连接javascript上使用gulp-uglify之后我发现了一些有趣的东西。 我将undefined传递给全局IIFE包装器,我发现它将它更改为void 0 什么是无效0? 我在控制台中运行它并返回undefined。 有趣! 这让我很好奇,所以我开始在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 ,因为它是一个使用operator void的表达式,不需要范围遍历来检查它的值。 如果将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)

摇滚明星确实很好地说明结果取决于代码的编写方式,例如是否访问了内存中有条件指定的值。 根据我的测试,如果你取值并将它作为参数传递给函数,它会有很大的不同。 此时,浏览器可能决定进行更少的优化。 尽管如此,在每个测试中,我运行void 0仍然比undefined更快或等效,使用更少的kb,并且它消除了对遍历范围的担忧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM