63

私は「ClosureCompiler」を使用しています。スクリプトをコンパイルするとき、次のように費やします。

コンパイルする前に:

// ==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({});

これで「void0」と「undefined」の使い方の質問は、使い方に違いはあるのでしょうか、それとも2つのケースでいいのでしょうか。

編集

「void0」でコンパイルされた「varundefined」を定義した場合、「undedined。」でコンパイルされた「undefined」を定義しなかった場合、「undefined」と「void0」の間の文字数の問題ではありません。

テスト

編集II:このリンクに基づくパフォーマンス

コードとテスト

IE 8:
typeof:228ms
未定義:62ms
void 0:57ms

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

Opera 11:
typeof:67ms
undefined:19ms
void 0:20ms

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

4

4 に答える 4

73

MDNから

void演算子は、指定されたものを評価してから、expressionを返しますundefined

この演算子を使用すると、未定義と評価される式が必要な場所に、副作用を引き起こす式を挿入できます。

void演算子は、多くの場合、undefinedプリミティブ値を取得するためだけに使用され、通常は " void(0)"( ""と同等void 0)を使用します。このような場合は、代わりにグローバル変数undefinedを使用できます(デフォルト以外の値に割り当てられていない場合)。

クロージャコンパイラは、より少ない文字を含むためにスワップインしますvoid 0したがって、同等のより小さなコードが生成されます。undefined


Re:OPコメント

はい、ドキュメントを読みましたが、私が示した例では、「void0」と別の「undefined」を使用した場合の「googleclosure」

これは実際にはGoogleClosureCompilerのバグだと思います。

于 2011-01-26T15:30:22.323 に答える
55

との実際の唯一のセマンティックの違いは、void exprECMAScript 3では、グローバルオブジェクト(ブラウザ環境)のプロパティが書き込み可能であるのに対し、演算子は常に値 を返すことです。undefinedundefinedwindow.undefinedvoidundefined

しばしば実装される人気のあるパターンは、undefined心配することなく使用するために、単に引数を宣言し、それに何も渡さないことです。

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

})();

void 0これにより、ミニファイアは引数をおそらく1文字( :)よりも短くすることができます。例:

(function (a) {
  //...
  if (foo !== a) {
    // ...
  }
})();
于 2011-01-26T15:36:08.773 に答える
8

以前のすべての回答のフォローアップです。

それらは同じように見えますが、コンパイラーにとっては完全に異なります。

2つのコードセクションは、1つがローカル変数(var undefined)を参照しているため、異なる出力にコンパイルされます。コンパイラーは、1回だけ使用され、1行以内であるため、単純にインライン化します。複数回使用した場合、このインライン化は発生しません。インライン化は、「未定義」の結果を提供します。これは、「void0」として表すために短くなります。

ローカル変数がないものは、グローバルオブジェクトの下にある「undefined」と呼ばれる変数を参照しています。これは、ClosureCompilerによって自動的に「外部化」されます(実際、すべてのグローバルオブジェクトのプロパティはそうです)。したがって、名前の変更は行われず、インライン化も行われません。出来上がり!まだ「未定義」。

于 2011-03-10T12:33:50.393 に答える
4

違いはありません。自分で試してみてください。

void 0 === undefined

に評価されtrueます。3
undefined文字長いので、そういう風に使っているのだと思います。

于 2011-01-26T15:28:00.413 に答える