簡體   English   中英

“void 0”和“undefined”之間的區別

[英]difference between “void 0 ” and “undefined”

我正在使用“Closure Compiler” ,在編譯腳本時我會花費以下內容:

編譯之前:

// ==ClosureCompiler==
// @compilation_level SIMPLE_OPTIMIZATIONS
// @output_file_name default.js
// @formatting pretty_print,print_input_delimiter
// ==/ClosureCompiler==

var myObj1 = (function() {

  var undefined;   //<----- declare undefined

  this.test = function(value, arg1) {

    var exp = 0;
    arg1 = arg1 == undefined ? true : arg1;  //<----- use declare undefined
    exp = (arg1) ? value * 5 :  value * 10;

    return exp;
  };

  return this;
}).call({});

var myObj2 = (function() {

  this.test = function(value, arg1) {

    var exp = 0;
    arg1 = arg1 == undefined ? true : arg1;  //<----- without declare undefined
    exp = (arg1) ? value * 5 :  value * 10;

    return exp;
  };

  return this;
}).call({});

編譯:

// Input 0
var myObj1 = function() {
  this.test = function(b, a) {
    a = a == void 0 ? true : a;  //<-----
    var c = 0;
    return c = a ? b * 5 : b * 10
  };
  return this
}.call({}), myObj2 = function() {
  this.test = function(b, a) {
    a = a == undefined ? true : a; //<-----
    var c = 0;
    return c = a ? b * 5 : b * 10
  };
  return this
}.call({});

有了這個我相信使用“void 0”和“undefined”的問題,在使用上有什么不同或兩種情況都很好嗎?

編輯

如果我定義用“void 0”編譯的“var undefined”,如果我沒有定義用“undedined”編譯的“undefined”,那么不是“undefined”和“void 0”之間的字符數問題

測試

編輯II:性能,基於此鏈接

代碼和測試

IE 8:
typeof:228ms
undefined:62ms
void 0:57ms

Firefox 3.6:
typeof:10ms
undefined:3ms
void 0:3ms

歌劇11:
typeof:67ms
undefined:19ms
void 0:20ms

Chrome 8:
typeof:3ms
undefined:5ms
void 0:3ms

來自MDN

void運算符計算給定的expression ,然后返回undefined

此運算符允許將產生副作用的表達式插入到需要求值為undefined的表達式的位置。

void運算符通常僅用於獲取undefined原始值,通常使用“ void(0) ”(相當於“ void 0 ”)。 在這些情況下,可以使用undefined的全局變量(假設它尚未分配給非默認值)。

Closure Compiler在void 0交換,因為它包含的字符數少於undefined的字符數, 因此生成相同的較小代碼


回復:OP評論

是的,我閱讀了文檔,但在我給出的示例中,“google closure”在使用“void 0”和另一個“undefined”的情況下

我相信這實際上是Google Closure Compiler中的一個錯誤

void exprundefined之間真正唯一的語義區別在於ECMAScript 3 ,全局對象的undefined屬性(瀏覽器環境中的window.undefined )是可寫的,而void運算符將始終返回undefined值。

一個經常實現的流行模式,使用undefined而不用擔心只是聲明一個參數,而不是傳遞任何東西:

(function (undefined) {
  //...
  if (foo !== undefined) {
    // ...
  }

})();

這將允許minifiers將參數縮小到一個字母(甚至比void 0 :)更短,例如:

(function (a) {
  //...
  if (foo !== a) {
    // ...
  }
})();

只是對之前所有答案的后續跟進。

它們看起來一樣,但對於編譯器來說它們完全不同。

這兩個代碼段編譯為不同的輸出,因為一個是指一個局部變量(var undefined),而編譯器只是內聯它,因為它只使用一次並且不超過一行。 如果不止一次使用,則不會發生這種內襯。 內襯提供“未定義”的結果,其更短以表示為“空0”。

沒有局部變量的那個是指全局對象下名為“undefined”的變量,它由Closure Compiler自動“外部”(實際上,所有全局對象屬性都是)。 因此,不進行重命名,也不會發生內襯。 瞧! 仍然“未定義”。

沒有區別,請親自嘗試一下:

void 0 === undefined

將評估為true
undefined3個字符更長,我想這就是他們以這種方式使用它的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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