Wie kann man am besten überprüfen, ob eine Objekteigenschaft in JavaScript undefiniert ist?
Antworten
Zu viele Anzeigen?Der übliche Weg, um zu prüfen, ob der Wert einer Eigenschaft der spezielle Wert ist undefined
ist:
if(o.myProperty === undefined) {
alert("myProperty value is the special value `undefined`");
}
Um zu prüfen, ob ein Objekt eine solche Eigenschaft tatsächlich nicht hat, und daher undefined
standardmäßig, wenn Sie versuchen, darauf zuzugreifen:
if(!o.hasOwnProperty('myProperty')) {
alert("myProperty does not exist");
}
So prüfen Sie, ob der einem Bezeichner zugeordnete Wert der besondere Wert ist undefined
, oder wenn dieser Bezeichner nicht deklariert wurde:
if(typeof myVariable === 'undefined') {
alert('myVariable is either the special value `undefined`, or it has not been declared');
}
Hinweis: Die letztgenannte Methode ist die einzige Möglichkeit, sich auf eine nicht deklariert Identifikator ohne einen frühen Fehler, was sich von einem Wert von undefined
.
In JavaScript-Versionen vor ECMAScript 5 war die Eigenschaft "undefined" des globalen Objekts beschreibbar, so dass eine einfache Prüfung foo === undefined
könnte sich unerwartet verhalten, wenn es versehentlich umdefiniert worden wäre. In modernem JavaScript ist die Eigenschaft schreibgeschützt.
In modernem JavaScript ist "undefined" jedoch kein Schlüsselwort, und so können Variablen innerhalb von Funktionen "undefined" genannt werden und die globale Eigenschaft beschatten.
Wenn Sie sich über diesen (unwahrscheinlichen) Grenzfall Sorgen machen, können Sie der Leerraumoperator um an das besondere undefined
Wert selbst:
if(myVariable === void 0) {
alert("myVariable is the special value `undefined`");
}
Ich glaube, es gibt eine Reihe von falschen Antworten zu diesem Thema. Entgegen der landläufigen Meinung ist "undefiniert" pas ist ein Schlüsselwort in JavaScript und kann tatsächlich mit einem Wert belegt werden.
Korrekter Code
Die zuverlässigste Methode zur Durchführung dieses Tests ist:
if (typeof myVar === "undefined")
Dies wird immer das richtige Ergebnis liefern und sogar die Situation behandeln, in der myVar
nicht deklariert ist.
Entarteter Code. NICHT VERWENDEN.
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 auslösen, wenn myVar nicht deklariert ist.
Obwohl es in vielen anderen Antworten hier vehement empfohlen wird, typeof
ist eine schlechte Wahl . Sie sollte niemals dazu verwendet werden, zu prüfen, ob Variablen den Wert undefined
weil sie als kombinierte Prüfung für den Wert undefined
und ob eine Variable existiert. In den allermeisten Fällen wissen Sie, wann eine Variable vorhanden ist, und typeof
führt lediglich dazu, dass ein Tippfehler im Variablennamen oder im Zeichenfolgenliteral zu einem stillen Fehler führen kann '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!
}
Wenn Sie also keine Feature-Erkennung² durchführen, bei der es unsicher ist, ob ein bestimmter Name im Geltungsbereich ist (z. B. bei der Überprüfung von typeof module !== 'undefined'
als ein Schritt im Code, der für eine CommonJS-Umgebung spezifisch ist), typeof
ist schädlich, wenn es auf eine Variable angewendet wird, und die richtige Option ist, den Wert direkt zu vergleichen:
var foo = …;
if (foo === undefined) {
}
Diesbezüglich gibt es einige weit verbreitete Missverständnisse:
-
dass das Lesen einer "nicht initialisierten" Variablen (
var foo
) oder Parameter (function bar(foo) { … }
, bezeichnet alsbar()
) wird scheitern. Das ist einfach nicht wahr - Variablen ohne explizite Initialisierung und Parameter, denen keine Werte gegeben wurden, werden immerundefined
und sind immer in Reichweite. -
dass
undefined
überschrieben werden kann. Es ist wahr, dassundefined
ist kein Schlüsselwort, aber es ist schreibgeschützt und nicht konfigurierbar. Es gibt andere Built-Ins, die Sie trotz ihres Nicht-Schlüsselwort-Status wahrscheinlich nicht meiden werden (Object
,Math
,NaN
) und praktischer Code wird in der Regel nicht in einer aktiv bösartigen Umgebung geschrieben, so dass dies kein guter Grund ist, sich Sorgen zu machenundefined
. (Wenn Sie jedoch einen Codegenerator schreiben, können Sie auchvoid 0
.)
Nachdem die Funktionsweise von Variablen geklärt ist, ist es nun an der Zeit, sich mit der eigentlichen Frage zu befassen: den Objekteigenschaften. Es gibt keinen Grund, jemals typeof
für Objekteigenschaften. Die frühere Ausnahme bezüglich der Merkmalserkennung trifft hier nicht zu - typeof
hat nur bei Variablen ein besonderes Verhalten, und Ausdrücke, die auf Objekteigenschaften verweisen, sind keine Variablen.
Dies:
if (typeof foo.bar === 'undefined') {
}
ist immer genau gleichwertig zu diesem³:
if (foo.bar === undefined) {
}
und unter Berücksichtigung der obigen Ratschläge, um die Leser nicht zu verwirren, warum Sie typeof
weil es am sinnvollsten ist, die ===
um auf Gleichheit zu prüfen, weil es später auf die Prüfung eines Variablenwerts umgestellt werden kann und weil es einfach besser aussieht, sollten Sie immer === undefined
³ auch hier .
Eine weitere Frage, die man sich bei Objekteigenschaften stellen sollte, ist die, ob man wirklich prüfen will, ob undefined
überhaupt nicht. Ein gegebener Eigenschaftsname kann bei einem Objekt fehlen (was den Wert undefined
beim Lesen), die auf dem Objekt selbst mit dem Wert undefined
die im Prototyp des Objekts mit dem Wert undefined
oder auf einem der beiden mit einem nicht undefined
Wert. 'key' in obj
sagt Ihnen, ob ein Schlüssel irgendwo in der Prototypenkette eines Objekts vorkommt, und Object.prototype.hasOwnProperty.call(obj, 'key')
sagt Ihnen, ob es sich direkt auf dem Objekt befindet. Ich werde in dieser Antwort jedoch nicht näher auf Prototypen und die Verwendung von Objekten als String-Keyed-Maps eingehen, da sie hauptsächlich dazu gedacht ist, all den schlechten Ratschlägen in anderen Antworten entgegenzuwirken, ungeachtet der möglichen Interpretationen der ursprünglichen Frage. Lesen Sie mehr über 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.
² Gehen Sie nicht davon aus, dass es generell in Ordnung ist, nicht zu wissen, was sich im Geltungsbereich befindet. bonus vulnerability caused by abuse of dynamic scope: <a href="https://bugs.chromium.org/p/project-zero/issues/detail?id=1225&desc=6" rel="noreferrer">Projekt Null 1225</a>
Wiederum unter der Annahme einer ES5+-Umgebung und der Annahme, dass <code>undefined</code> bezieht sich auf die <code>undefined</code> Eigenschaft des globalen Objekts.
In JavaScript gibt es null und es gibt undefiniert . Sie haben unterschiedliche Bedeutungen.
- undefiniert bedeutet, dass der Wert der Variablen nicht definiert wurde; es ist nicht bekannt, wie hoch der Wert ist.
- null bedeutet, dass der Variablenwert definiert und auf null gesetzt ist (keinen Wert hat).
Marijn Haverbeke erklärt in seinem kostenlosen Online-Buch " Eloquentes JavaScript " (Hervorhebung von mir):
Es gibt auch einen ähnlichen Wert, null, dessen Bedeutung lautet: "Dieser Wert ist definiert, aber er hat keinen Wert". Der Bedeutungsunterschied zwischen "undefined" und "null" ist meist akademischer Natur und in der Regel nicht sehr interessant. In praktischen Programmen ist es oft notwendig zu prüfen, ob etwas "einen Wert hat". In diesen Fällen kann der Ausdruck irgendetwas == undefiniert verwendet werden, da null == undefiniert wahr ist, auch wenn es sich nicht um genau denselben Wert handelt.
Der beste Weg, um zu prüfen, ob etwas undefiniert ist, wäre also:
if (something == undefined)
Objekteigenschaften sollten auf die gleiche Weise funktionieren.
var person = {
name: "John",
age: 28,
sex: "male"
};
alert(person.name); // "John"
alert(person.fakeVariable); // undefined
Was bedeutet das? "undefinierte Objekteigenschaft" ?
Eigentlich kann es zwei ganz unterschiedliche Dinge bedeuten! Erstens kann es bedeuten die Eigenschaft, die nie definiert wurde im Objekt und zweitens kann es bedeuten, dass die Eigenschaft, die einen undefinierten Wert hat . Schauen wir uns diesen Code an:
var o = { a: undefined }
Ist o.a
undefiniert? Ja! Sein Wert ist undefiniert. Ist o.b
undefiniert? Aber sicher! Es gibt überhaupt keine Eigenschaft 'b'! OK, sehen Sie nun, 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
Wir können deutlich sehen, dass typeof obj.prop == 'undefined'
y obj.prop === undefined
sind gleichwertig und unterscheiden nicht zwischen diesen verschiedenen Situationen. Und 'prop' in obj
kann die Situation erkennen, in der eine Eigenschaft überhaupt nicht definiert wurde, und achtet nicht auf den Eigenschaftswert, der undefiniert sein kann.
Was ist also zu tun?
1) Sie möchten wissen, ob eine Eigenschaft entweder in der ersten oder zweiten Bedeutung undefiniert ist (die typischste Situation).
obj.prop === undefined // IMHO, see "final fight" below
2) Sie wollen nur wissen, ob ein Objekt eine Eigenschaft hat und sich nicht um seinen Wert kümmern.
'prop' in obj
Anmerkungen:
- Sie können nicht gleichzeitig ein Objekt und seine Eigenschaft prüfen. Zum Beispiel ist dies
x.a === undefined
oder diestypeof x.a == 'undefined'
hebtReferenceError: x is not defined
wenn x nicht definiert ist. - Variabel
undefined
ist eine globale Variable (also ist sie eigentlichwindow.undefined
in Browsern). Es wird seit ECMAScript 1st Edition unterstützt und ist seit ECMAScript 5 nur lesen . In modernen Browsern kann es also nicht sein umdefiniert zu true wie uns viele Autoren gerne weismachen wollen, aber das gilt auch für ältere Browser.
Letzter Kampf: obj.prop === undefined
gegen typeof obj.prop == 'undefined'
Vorteile von obj.prop === undefined
:
- Es ist etwas kürzer und sieht etwas hübscher aus
- Die JavaScript-Engine gibt eine Fehlermeldung aus, wenn Sie sich vertippt haben
undefined
Minuspunkte von obj.prop === undefined
:
undefined
kann in alten Browsern außer Kraft gesetzt werden
Vorteile von typeof obj.prop == 'undefined'
:
- Es ist wirklich universell! Es funktioniert in neuen und alten Browsern.
Minuspunkte von typeof obj.prop == 'undefined'
:
'undefned'
( falsch buchstabiert ) ist hier nur eine String-Konstante, so dass die JavaScript-Engine Ihnen nicht helfen kann, wenn Sie es falsch geschrieben haben, wie ich es gerade getan habe.
Aktualisieren (für Server-seitiges JavaScript):
Node.js unterstützt die globale Variable undefined
como global.undefined
(es kann auch ohne das Präfix "global" verwendet werden). Ich weiß nicht, wie es mit anderen Implementierungen von serverseitigem JavaScript aussieht.
- See previous answers
- Weitere Antworten anzeigen