535 Stimmen

typeof !== "undefiniert" vs. != null

Ich sehe oft JavaScript-Code, der auf diese Weise auf undefinierte Parameter usw. prüft:

if (typeof input !== "undefined") {
    // do stuff
}

Dies scheint etwas verschwenderisch zu sein, da es sowohl eine Typsuche als auch einen String-Vergleich beinhaltet, ganz zu schweigen von der Ausführlichkeit. Es ist notwendig, weil undefined könnte jedoch umbenannt werden.

Meine Frage ist:
Was ist an diesem Code besser als an diesem Ansatz?

if (null != input) {
    // do stuff
}

Soweit ich weiß, kann man nicht umdefinieren null damit es nicht unerwartet zu einem Bruch kommt. Und wegen des Typ-Zwangs der != Operator, der sowohl auf undefined y null ... was oft genau das ist, was Sie wollen (z.B. für optionale Funktionsparameter).

Dennoch scheint diese Form nicht weit verbreitet zu sein, und sie führt sogar dazu, dass JSLint Sie anschreit, weil Sie das böse != Betreiber.

Warum wird dies als schlechter Stil angesehen?

770voto

seanmonstar Punkte 11086

typeof ist sicherer, da der Bezeichner nie zuvor deklariert worden sein darf:

if(typeof neverDeclared === "undefined") // no errors

if(neverDeclared === null) // throws ReferenceError: neverDeclared is not defined

54voto

Joey Adams Punkte 39825

Wenn die Variable deklariert ist (entweder mit der var Schlüsselwort, als Funktionsargument oder als globale Variable), ist es meiner Meinung nach am besten, dies zu tun:

if (my_variable === undefined)

jQuery tut es, also ist es gut genug für mich :-)

Andernfalls müssen Sie typeof zur Vermeidung einer ReferenceError .

Wenn Sie erwarten, dass undefined umdefiniert wird, können Sie Ihren Code wie folgt verpacken:

(function(undefined){
    // undefined is now what it's supposed to be
})();

Oder Sie erhalten es über die void Betreiber:

const undefined = void 0;
// also safe

31voto

JOKe Punkte 1562

Eine gute Möglichkeit:

if(typeof neverDeclared == "undefined") //no errors

Am besten sieht es aber aus, wenn Sie über :

if(typeof neverDeclared === typeof undefined) //also no errors and no strings

14voto

Peeter Punkte 9062

Sie sollten sich keine Sorgen darüber machen, dass undefined umbenannt wird. Wenn jemand undefined umbenennt, haben Sie viel mehr Probleme als nur ein paar fehlgeschlagene if-Prüfungen. Wenn Sie Ihren Code wirklich schützen wollen, verpacken Sie ihn in einen IFFE (immediately invoked function expression) wie diesen:

(function($, Backbone, _, undefined) {
    //undefined is undefined here.
})(jQuery, Backbone, _);

Wenn Sie mit globalen Variablen (die bereits falsch ist) in einer Browser-Umgebung arbeiten, würde ich für undefinierte wie diese überprüfen:

if(window.neverDefined === undefined) {
    //Code works
}

Da globale Variablen Teil des Fensterobjekts sind, können Sie einfach auf undefiniert prüfen, anstatt in eine Zeichenfolge zu casten und Zeichenfolgen zu vergleichen.

Und warum sind Ihre Variablen nicht definiert? Ich habe schon viele Codes gesehen, in denen das Vorhandensein von Variablen geprüft und darauf basierend eine Aktion durchgeführt wurde. Nicht ein einziges Mal habe ich gesehen, dass dieser Ansatz korrekt war.

5voto

Ivo Wetzel Punkte 45471

Wenn Sie wirklich besorgt darüber sind, dass undefined umdefiniert wird, können Sie sich mit einer Hilfsmethode wie dieser davor schützen:

function is_undefined(value) {
   var undefined_check; // instantiate a new variable which gets initialized to the real undefined value
   return value === undefined_check;
}

Das funktioniert, denn wenn jemand schreibt undefined = "foo" lässt er nur die Name undefined Referenz auf einen neuen Wert, aber er ändert nicht den tatsächlichen Wert von undefined .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X