Frage

Ich benutze "Verschluss Compiler", Wenn ich meine Skripte zusammenstellte, verbringe ich Folgendes aus:

Vor dem Kompilieren:

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

Zusammengestellt:

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

Damit glaube ich die Frage nach der Verwendung von "void 0" und "undefiniert", gibt es einen Unterschied in der Verwendung oder die beiden Fälle sind gut?

Bearbeiten

Wenn ich "var undefiniert" definiere, kompiliert mit "void 0", wenn ich "undefined" nicht mit "undspurten" definiert habe. Dann keine Frage der Anzahl der Zeichen zwischen "undefiniert" und "void 0"

Prüfen

Bearbeiten II: Leistung basierend auf dieser Link

Code und Test

Dh 8:
Typof: 228 ms
undefiniert: 62 ms
Leere 0: 57 ms

Firefox 3.6:
Typof: 10 ms
undefiniert: 3 ms
Leere 0: 3 ms

Oper 11:
Typof: 67 ms
undefiniert: 19 ms
Leere 0: 20 ms

Chrom 8:
Typof: 3 ms
undefiniert: 5 ms
Leere 0: 3 ms

War es hilfreich?

Lösung

Von mdn:

Das void Der Bediener bewertet das gegebene expression und kehrt dann zurück undefined.

Dieser Bediener ermöglicht das Einfügen von Ausdrücken, die Nebenwirkungen in Orte erzeugen, an denen ein Ausdruck, der zu undefiniert bewertet wird, erwünscht ist.

Der Hohlraumoperator wird häufig nur verwendet, um die zu erhalten undefined primitiver Wert, normalerweise verwendet "void(0)"(Das entspricht"void 0"). In diesen Fällen die globale Variable undefined kann stattdessen verwendet werden (vorausgesetzt, es wurde einem Nicht-Default-Wert nicht zugeordnet).

Verschlüsse Compiler tauscht sich ein void 0 Weil es weniger Zeichen enthält als undefined, Daher erzeugen Sie einen äquivalenten, kleineren Code.


Re: OP -Kommentar

Ja, ich habe die Dokumentation gelesen, aber in dem Beispiel, das ich "Google Closure" in einem Fall mit "void 0" und einem anderen "undefinierten" gegeben habe, habe ich angegeben.

Ich glaube, das ist eigentlich ein Fehler im Google Closeure Compiler!

Andere Tipps

Der reale einzige semantische Unterschied zwischen void expr und undefined ist das an ECMascript 3, das undefined Eigenschaft des globalen Objekts (window.undefined in Browserumgebungen) ist beschreibbar, während die void Der Betreiber gibt die zurück undefined Wert stets.

Ein beliebtes Muster, das oft implementiert wird, um sie zu verwenden undefined Ohne Sorgen erklärt einfach ein Argument und gibt nichts daran:

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

})();

Dadurch können Minifiker das Argument möglicherweise auf einen einzigen Buchstaben verkleinern (noch kürzer als void 0 :), z.B:

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

Nur ein Follow-up zu allen Antworten zuvor.

Sie sehen gleich aus, aber für den Compiler sind sie völlig anders.

Die beiden Codeabschnitte kompilieren zu unterschiedlichen Ausgängen, da man sich auf eine lokale Variable bezieht (die VAR undefinierte), und der Compiler vermittelt sie einfach, da er genau einmal verwendet wird und nicht mehr als eine Zeile ist. Wenn es mehr als einmal verwendet wird, wird diese In-Graben nicht geschehen. Die In-Lining liefert ein Ergebnis von "undefiniert", das kürzer ist, um als "void 0" darzustellen.

Die ohne lokale Variable bezieht sich auf die Variable, die als "undefiniert" unter dem genannt wird globales Objekt, was vom Verschluss Compiler automatisch "extern" wird (tatsächlich sind alle globalen Objekteigenschaften). Daher findet keine Umbenennung statt, und es findet keine In-Lining statt. Voila! immer noch "undefiniert".

Es gibt keinen Unterschied, probieren Sie es selbst aus:

void 0 === undefined

wird bewerten zu true.
undefined ist 3 Charaktere länger, ich denke, das ist der Grund, warum sie es so verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top