[英]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.