簡體   English   中英

為什么檢查void 0比檢查undefined快得多?

[英]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 0undefined之間的區別。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM