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

时间:2017-11-29 15:11:10

标签: javascript performance

我在连接的javascript上使用gulp-uglify后发现了一些有趣的东西。我将undefined传递给全局IIFE包装器,我发现它正在将其更改为void 0。什么是无效0?我在控制台中运行它并返回undefined。有趣!这让我很好奇,所以我开始在void 0上运行测试。在我的控制台测试(简单循环和时间戳)中,我观察到的速度提高了180倍,具体取决于浏览器,检查void 0而不是{{ 1}}。有谁知道为什么检查void 0要快得多?

undefined

1 个答案:

答案 0 :(得分:2)

实际上,我刚刚意识到void 0undefined之间的区别。 undefined是全局范围的值,void是运算符。在这个测试中发生的是未定义的全局检查,而void 0,因为它是一个使用运算符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)

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