Ich sehe oft JavaScript-Code, der auf folgende Weise nach undefinierten Parametern usw. sucht:
if (typeof input !== "undefined") {
// do stuff
}
Dies scheint etwas verschwenderisch zu sein, da es sowohl eine Typensuche als auch einen Zeichenfolgenvergleich beinhaltet, ganz zu schweigen von seiner Ausführlichkeit. Es wird benötigt, weil undefined
es jedoch umbenannt werden könnte.
Meine Frage ist:
Wie ist dieser Code besser als dieser Ansatz:
if (null != input) {
// do stuff
}
Soweit ich weiß, können Sie nicht neu definieren null
, damit es nicht unerwartet kaputt geht. Und aufgrund des Typzwangs des !=
Operators wird sowohl nach undefined
als auch nach null
... gesucht, was häufig genau das ist, was Sie möchten (z. B. für optionale Funktionsparameter).
Diese Form scheint jedoch nicht weit verbreitet zu sein, und JSLint schreit Sie sogar an, weil Sie den bösen !=
Operator verwendet haben.
Warum wird das als schlechter Stil angesehen?
quelle
if (null != input)
ist nur "Yoda Speak" für den englischen Sprecher (von einem bin ich ... uuammmmm). Wenn sie also dem gleichen entsprechen, ist es wirklich nur Semantik. MEINER BESCHEIDENEN MEINUNG NACH.Antworten:
typeof
ist sicherer, da der Bezeichner noch nie deklariert wurde:quelle
==
kann es besser sein, da es sowohl auf null als auch auf undefiniert testet.!==
oder verwendet===
, wenn man einen Wert vergleicht, dessen Typ als Zeichenfolge bekannt ist.Wenn die Variable deklariert ist (entweder mit dem
var
Schlüsselwort, als Funktionsargument oder als globale Variable), ist der beste Weg, dies zu tun, meiner Meinung nach:jQuery macht es, also ist es gut genug für mich :-)
Andernfalls müssen Sie verwenden
typeof
, um a zu vermeidenReferenceError
.Wenn Sie erwarten, dass undefiniert neu definiert wird, können Sie Ihren Code wie folgt umbrechen:
Oder erhalten Sie es über den
void
Betreiber:quelle
undefined
ist der Name des Funktionsparameters, nicht sein Wert. Es wird nichts an die Funktion übergeben, was bedeutet, dass der Wert des ersten Parameters undefiniert ist.gute Möglichkeit:
Am besten sehen Sie jedoch nach:
quelle
if (typeof neverDeclared === typeof undefined) {
aber Lint wirft einen Fehler. "Ich habe eine Zeichenfolge erwartet und stattdessen 'typeof' gesehen." Wie würden Sie diesen Fehler umgehen? Sollten wir uns den Forderungen von Lint unterwerfen und stattdessen den "guten Weg" verwenden?typeof neverDeclared === typeof void 0
;-Dif(typeof neverDeclared === typeof undefined_variable_with_a_name_assumed_to_be_never_defined) {
aber es ist ziemlich lang.Sie sollten sich nicht wirklich Sorgen machen, dass undefiniert umbenannt wird. Wenn jemand undefiniert umbenennt, haben Sie viel mehr Probleme als nur ein paar, wenn die Prüfung fehlschlägt. Wenn Sie Ihren Code wirklich schützen möchten, verpacken Sie ihn wie folgt in ein IFFE (sofort aufgerufener Funktionsausdruck):
Wenn Sie mit globalen Variablen (die bereits falsch sind) in einer Browserumgebung arbeiten, würde ich nach Undefiniertem wie folgt suchen:
Da globale Variablen Teil des Fensterobjekts sind, können Sie einfach gegen undefiniert prüfen, anstatt sie in eine Zeichenfolge umzuwandeln und Zeichenfolgen zu vergleichen.
Warum sind Ihre Variablen nicht definiert? Ich habe viel Code gesehen, in dem sie die Existenz einer Variablen überprüfen und darauf basierend eine Aktion ausführen. Ich habe nicht ein einziges Mal gesehen, wo dieser Ansatz richtig war.
quelle
Wenn Sie sich wirklich Sorgen darüber machen, dass undefiniert neu definiert wird, können Sie sich mit einer Hilfsmethode wie dieser davor schützen:
Dies funktioniert, weil jemand beim Schreiben
undefined = "foo"
nur den Namenundefined
auf einen neuen Wert verweisen lässt , aber den tatsächlichen Wert von nicht ändertundefined
.quelle
undefined_check
und dann überall in Ihrem Code verwenden.typeof
Überprüfung.Sie können auch den void-Operator verwenden, um einen undefinierten Wert zu erhalten:
(Und ja, wie in einer anderen Antwort angegeben, wird dies einen Fehler auslösen, wenn die Variable nicht deklariert wurde. Dieser Fall kann jedoch häufig entweder durch Code-Inspektion oder durch Code-Refactoring ausgeschlossen werden, z. B.
window.input !== void 0
zum Testen globaler Variablen oder zum Hinzufügenvar input
.)quelle
Ich bin tatsächlich auf etwas gestoßen, wenn es
(typeof input !== 'undefined')
in diesem Szenario verwendet wird, um Standardfunktionsparameter bereitzustellen:ES6 bietet neue Möglichkeiten zur Einführung von Standardfunktionsparametern auf folgende Weise:
Dies ist weniger ausführlich und sauberer als die erste Option.
quelle
quelle
quelle
quelle
funktioniert gut. Es ist natürlich kein
null
Vergleich, aber ich finde normalerweise, dass ich, wenn ich zwischenundefined
und unterscheiden mussnull
, eigentlich eher zwischenundefined
und nur irgendeinen falschen Wert unterscheiden muss, alsomacht es.
Wenn ein Programm neu definiert
undefined
, ist es sowieso wirklich geisteskrank.Der einzige Grund, an den ich denken kann, war die IE4-Kompatibilität. Es hat das
undefined
Schlüsselwort nicht verstanden (was leider eigentlich kein Schlüsselwort ist), aber natürlich könnten Werte seinundefined
, also musste man folgendes haben:und der obige Vergleich würde gut funktionieren.
In Ihrem zweiten Beispiel benötigen Sie wahrscheinlich doppelte Klammern, um Flusen glücklich zu machen?
quelle
input == undefined
werdentrue
bei einernull
Eingabe zurückkehren.