Unterschied zwischen "void 0" und "undefiniert"
-
24-10-2019 - |
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"
Bearbeiten II: Leistung basierend auf dieser Link
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
Lösung
Das
void
Der Bediener bewertet das gegebeneexpression
und kehrt dann zurückundefined
.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 Variableundefined
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.