gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:00:47 26 4
gpt4 key购买 nike

在我的串联 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com