我在连接的javascript上使用gulp-uglify后发现了一些有趣的东西。我将undefined
传递给全局IIFE包装器,我发现它正在将其更改为void 0
。什么是无效0?我在控制台中运行它并返回undefined。有趣!这让我很好奇,所以我开始在void 0上运行测试。在我的控制台测试(简单循环和时间戳)中,我观察到的速度提高了180倍,具体取决于浏览器,检查void 0
而不是{{ 1}}。有谁知道为什么检查void 0要快得多?
undefined
答案 0 :(得分:2)
实际上,我刚刚意识到void 0
和undefined
之间的区别。 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,并且它消除了对遍历范围的担忧。