Frage Eine undefinierte Objekteigenschaft erkennen


Was ist der beste Weg zu überprüfen, ob eine Objekteigenschaft in JavaScript nicht definiert ist?


2430
2017-08-26 07:25


Ursprung


Antworten:


Benutzen:

if (typeof something === "undefined") {
    alert("something is undefined");
}

Wenn eine Objektvariable einige Eigenschaften hat, kann man dasselbe wie folgt verwenden:

if (typeof my_obj.someproperties === "undefined"){
    console.log('the property is not available...'); // print into console
}

Seit ECMAScript 5, undefined kann nicht überschrieben werden, also my_obj === undefined würde auch funktionieren, aber nur wenn my_obj existiert. Dies kann oder kann nicht erwünscht sein, da Sie auch verwenden können null wenn Sie diese Semantik brauchen (siehe Was ist der Unterschied zwischen null und undefined in JavaScript?). Für Objekteigenschaften funktioniert es jedoch unabhängig davon, ob die Eigenschaft vorhanden ist.


2316
2018-01-06 12:27



Ich glaube, es gibt eine Reihe von falschen Antworten zu diesem Thema. Entgegen der landläufigen Meinung ist "undefined" nicht ein Schlüsselwort in JavaScript und kann tatsächlich einen Wert zugewiesen bekommen.

Code korrigieren

Der robusteste Weg, diesen Test durchzuführen, ist:

if (typeof myVar === "undefined")

Dies liefert immer das korrekte Ergebnis und behandelt sogar die Situation, in der myVar ist nicht deklariert.

Degenerierter Code. VERWENDE NICHT.

var undefined = false;  // Shockingly, this is completely legal!
if (myVar === undefined) {
    alert("You have been misled. Run away!");
}

Zusätzlich, myVar === undefined wird einen Fehler in der Situation verursachen, in der myVar nicht deklariert ist.


803
2017-08-23 18:03



In JavaScript gibt es Null und da ist nicht definiert. Sie haben unterschiedliche Bedeutungen.

  • nicht definiert bedeutet, dass der Variablenwert nicht definiert wurde; Es ist nicht bekannt, was der Wert ist.
  • Null bedeutet, dass der Variablenwert definiert und auf null gesetzt ist (hat keinen Wert).

Marijn Haverkeke stellt in seinem kostenlosen Online-Buch fest:Eloquentes JavaScript"(Hervorhebung von mir):

Es gibt auch einen ähnlichen Wert, null, dessen Bedeutung ist "dieser Wert ist definiert, aber er hat keinen Wert". Der Bedeutungsunterschied zwischen undefiniert und null ist meist akademisch und normalerweise nicht sehr interessant. In praktischen Programmen muss oft überprüft werden, ob etwas "einen Wert hat". In diesen Fällen kann der Ausdruck etwas == undefiniert verwendet werden, da, obwohl sie nicht genau den gleichen Wert haben, null == undefined true ergibt.

Also, ich denke, der beste Weg zu prüfen, ob etwas undefiniert ist, wäre:

if (something == undefined)

Hoffe das hilft!

Bearbeiten: Als Reaktion auf Ihre Bearbeitung sollten Objekteigenschaften auf die gleiche Weise funktionieren.

var person = {
    name: "John",
    age: 28,
    sex: "male"
};

alert(person.name); // "John"
alert(person.fakeVariable); // undefined

133
2017-08-26 07:36



Obwohl es hier von vielen anderen Antworten vehement empfohlen wird, typeof  ist eine schlechte Wahl. Es sollte niemals zur Überprüfung verwendet werden, ob Variablen den Wert haben undefined, weil es als eine kombinierte Prüfung für den Wert fungiert undefined und ob eine Variable existiert. In den allermeisten Fällen wissen Sie, wann eine Variable existiert und typeof wird nur das Potenzial für einen stillen Fehler einführen, wenn Sie im Variablennamen oder im String-Literal einen Tippfehler machen 'undefined'.

var snapshot = …;

if (typeof snaposhot === 'undefined') {
    //         ^
    // misspelled¹ – this will never run, but it won’t throw an error!
}
var foo = …;

if (typeof foo === 'undefned') {
    //                   ^
    // misspelled – this will never run, but it won’t throw an error!
}

Also, es sei denn, Sie tun Feature-Erkennung², wo Unsicherheit, ob ein gegebener Name in Reichweite sein wird (wie Überprüfung typeof module !== 'undefined' als ein Schritt in Code, der für eine CommonJS-Umgebung spezifisch ist), typeof ist eine schädliche Wahl, wenn es für eine Variable verwendet wird, und die korrekte Option ist, den Wert direkt zu vergleichen:

var foo = …;

if (foo === undefined) {
    ⋮
}

Einige häufige Missverständnisse dazu gehören:

  • das Lesen einer "nicht initialisierten" Variablen (var foo) oder Parameter (function bar(foo) { … }, genannt als bar()) wird versagen. Dies ist einfach nicht wahr - Variablen ohne explizite Initialisierung und Parameter, die keine Werte erhielten, werden immer undefinedund sind immer im Umfang.

  • Das undefined kann überschrieben werden. Es gibt noch viel mehr. undefined ist kein Schlüsselwort in JavaScript. Stattdessen ist es eine Eigenschaft für das globale Objekt mit dem Wert Undefined. Seit ES5 wurde diese Eigenschaft jedoch verwendet schreibgeschützt und nicht konfigurierbar. Kein moderner Browser erlaubt das undefined Eigentum geändert werden, und seit 2017 ist dies der Fall für eine lange Zeit. Das Fehlen des strikten Modus hat keinen Einfluss undefinedDas Verhalten entweder - es macht nur Aussagen wie undefined = 5 nichts tun, anstatt zu werfen. Da es sich jedoch nicht um ein Keyword handelt, können Sie das tun erklären Variablen mit dem Namen undefinedund diese Variablen könnten geändert werden, um dieses einmalige Muster zu erstellen:

    (function (undefined) {
        // …
    })()
    

    Mehr gefährlicher als die Verwendung der globalen undefined. Wenn Sie ES3-kompatibel sein müssen, ersetzen Sie es undefined mit void 0 - greifen Sie nicht auf typeof. (void war immer ein unärer Operator, der für jeden Operanden den Wert Undefiniert auswertet.)

Mit wie Variablen aus dem Weg arbeiten, ist es Zeit, die eigentliche Frage zu beantworten: Objekteigenschaften. Es gibt keinen Grund, jemals zu verwenden typeof für Objekteigenschaften. Die frühere Ausnahme bezüglich der Merkmalserkennung gilt hier nicht - typeof weist nur ein spezielles Verhalten für Variablen auf, und Ausdrücke, die Objekteigenschaften referenzieren, sind keine Variablen.

Dies:

if (typeof foo.bar === 'undefined') {
    ⋮
}

ist immer genau gleichwertig zu diesem³:

if (foo.bar === undefined) {
    ⋮
}

und unter Berücksichtigung des obigen Hinweises, um die Leser nicht zu verwirren, warum Sie sie verwenden typeofweil es am sinnvollsten ist zu verwenden === um nach Gleichheit zu suchen, weil es später umgestaltet werden könnte, um den Wert einer Variablen zu überprüfen, und weil es einfach besser aussieht, Du solltest immer benutzen === undefined³ auch hier.

Etwas anderes, wenn es um Objekteigenschaften geht, ist, ob Sie wirklich danach suchen wollen undefined überhaupt. Ein bestimmter Eigenschaftenname kann in einem Objekt fehlen (erzeugt den Wert) undefined wenn gelesen), auf dem Objekt selbst mit dem Wert vorhanden undefined, auf dem Prototyp des Objekts mit dem Wert vorhanden undefinedoder auf einem von denen mit einem nichtundefined Wert. 'key' in obj wird Ihnen sagen, ob ein Schlüssel irgendwo in der Prototypkette eines Objekts ist, und Object.prototype.hasOwnProperty.call(obj, 'key') wird Ihnen sagen, ob es direkt auf dem Objekt ist. Ich werde in dieser Antwort auf Prototypen und die Verwendung von Objekten als stringcodierte Karten nicht näher eingehen, da sie meist dazu gedacht ist, allen schlechten Ratschlägen in anderen Antworten entgegenzuwirken, ungeachtet der möglichen Interpretationen der ursprünglichen Frage. Lesen Sie weiter Objektprototypen auf MDN für mehr!

¹ ungewöhnliche Wahl des Namens der Beispielvariablen? Das ist echter toter Code aus der NoScript-Erweiterung für Firefox.
² gehe nicht davon aus, dass es nicht gut ist zu wissen, was im Umfang ist. Bonus-Schwachstelle durch Missbrauch des dynamischen Bereichs: Projekt Null 1225
³ wieder einmal eine ES5 + -Umgebung und das vorausgesetzt undefined bezieht sich auf undefined Eigenschaft des globalen Objekts. Ersatz void 0 Andernfalls.


130
2018-02-26 21:17



Was bedeutet das: "undefinierte Objekteigenschaft"?

Eigentlich kann es zwei ganz verschiedene Dinge bedeuten! Erstens kann es bedeuten die Eigenschaft, die nie definiert wurde im Objekt und zweitens kann es das bedeuten Eigenschaft, die einen nicht definierten Wert hat. Schauen wir uns diesen Code an:

var o = { a: undefined }

Ist o.a nicht definiert? Ja! Sein Wert ist nicht definiert. Ist o.b nicht definiert? Sicher! Es gibt keine Eigenschaft 'b' überhaupt! OK, sehen Sie sich jetzt an, wie sich verschiedene Ansätze in beiden Situationen verhalten:

typeof o.a == 'undefined' // true
typeof o.b == 'undefined' // true
o.a === undefined // true
o.b === undefined // true
'a' in o // true
'b' in o // false

Das können wir deutlich sehen typeof obj.prop == 'undefined' und obj.prop === undefined sind gleichwertig, und sie unterscheiden diese verschiedenen Situationen nicht. Und 'prop' in obj kann die Situation erkennen, wenn eine Eigenschaft überhaupt nicht definiert wurde und nicht auf den Eigenschaftswert achten, der undefiniert sein kann.

Also was zu tun?

1) Sie möchten wissen, ob eine Eigenschaft durch die erste oder zweite Bedeutung undefiniert ist (die typischste Situation).

obj.prop === undefined // IMHO, see "final fight" below

2) Sie möchten nur wissen, ob das Objekt eine Eigenschaft hat und sich nicht um seinen Wert kümmert.

'prop' in obj

Anmerkungen:

  • Sie können ein Objekt und seine Eigenschaft nicht gleichzeitig überprüfen. Zum Beispiel, dies x.a === undefined oder dieses typeof x.a == 'undefined' erhebt ReferenceError: x is not defined wenn x nicht definiert ist.
  • Variable undefined ist eine globale Variable (also ist es tatsächlich window.undefined in Browsern). Es wird seit ECMAScript 1st Edition und seit ECMAScript 5 unterstützt schreibgeschützt. In modernen Browsern kann das nicht sein redefiniert zu wahr so viele Autoren lieben es, uns zu erschrecken, aber dies gilt immer noch für ältere Browser.

Endkampf: obj.prop === undefined vs typeof obj.prop == 'undefined'

Plus von obj.prop === undefined:

  • Es ist ein bisschen kürzer und sieht ein bisschen hübscher aus
  • Die JavaScript-Engine gibt Ihnen einen Fehler, wenn Sie falsch geschrieben haben undefined

Minus von obj.prop === undefined:

  • undefined kann in alten Browsern überschrieben werden

Plus von typeof obj.prop == 'undefined':

  • Es ist wirklich universell! Es funktioniert in neuen und alten Browsern.

Minus von typeof obj.prop == 'undefined':

  • 'undefned' (falsch geschrieben) Hier ist nur eine String-Konstante, also kann die JavaScript-Engine Ihnen nicht helfen, wenn Sie es falsch geschrieben haben, wie ich es gerade getan habe.

Update (für serverseitiges JavaScript):

Node.js unterstützt die globale Variable undefined wie global.undefined (Es kann auch ohne das Präfix 'global' verwendet werden). Ich kenne keine anderen Implementierungen von serverseitigem JavaScript.


100
2017-08-08 20:28



Das Problem läuft auf drei Fälle hinaus:

  1. Das Objekt hat die Eigenschaft und sein Wert ist nicht undefined.
  2. Das Objekt hat die Eigenschaft und seinen Wert ist undefined.
  3. Das Objekt verfügt nicht über die Eigenschaft.

Das sagt uns etwas, was ich für wichtig halte:

Es gibt einen Unterschied zwischen einem nicht definierten Mitglied und einem definierten Mitglied mit einem undefinierten Wert.

Aber unglücklich typeof obj.foo sagt uns nicht, welche der drei Fälle wir haben. Jedoch können wir dies mit kombinieren "foo" in objum die Fälle zu unterscheiden.

                               |  typeof obj.x === 'undefined' | !("x" in obj)
1.                     { x:1 } |  false                        | false
2.    { x : (function(){})() } |  true                         | false
3.                          {} |  true                         | true

Es ist erwähnenswert, dass diese Tests die gleichen sind null Einträge auch

                               |  typeof obj.x === 'undefined' | !("x" in obj)
                    { x:null } |  false                        | false

Ich würde argumentieren, dass es in manchen Fällen sinnvoller (und klarer) ist, zu prüfen, ob die Eigenschaft vorhanden ist, als zu prüfen, ob sie nicht definiert ist, und der einzige Fall, in dem diese Überprüfung anders ist, ist Fall 2, der seltene Fall ein tatsächlicher Eintrag im Objekt mit einem nicht definierten Wert.

Zum Beispiel: Ich habe gerade einen Haufen Code umgestaltet, der eine Reihe von Überprüfungen hatte, ob ein Objekt eine bestimmte Eigenschaft hat.

if( typeof blob.x != 'undefined' ) {  fn(blob.x); }

Was war klarer, wenn ohne einen Scheck für undefined geschrieben.

if( "x" in blob ) { fn(blob.x); }

Aber wie bereits erwähnt, sind diese nicht genau die gleichen (aber mehr als gut genug für meine Bedürfnisse).


59
2018-06-08 04:04



if ( typeof( something ) == "undefined") 

Das funktionierte für mich, die anderen nicht.


38
2017-07-27 16:03



Ich bin mir nicht sicher, wo der Ursprung der Verwendung liegt === mit typeof kam aus, und als eine Konvention sehe ich es in vielen Bibliotheken verwendet, aber der Operator typeof gibt ein String-Literal, und wir wissen, dass im Voraus, also warum sollten Sie auch überprüfen möchten es auch?

typeof x;                      // some string literal "string", "object", "undefined"
if (typeof x === "string") {   // === is redundant because we already know typeof returns a string literal
if (typeof x == "string") {    // sufficient

33
2017-09-22 14:20