[英]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 0
和undefined
之间的区别。 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.