Wie kann man am besten überprüfen, ob eine Objekteigenschaft in JavaScript undefiniert ist?
Antworten
Zu viele Anzeigen?Wenn Sie das tun
if (myvar == undefined )
{
alert('var does not exists or is not initialized');
}
wird fehlschlagen, wenn die Variable myvar
existiert nicht, weil myvar nicht definiert ist, so dass das Skript kaputt ist und der Test keine Wirkung hat.
Da das Fensterobjekt außerhalb einer Funktion einen globalen Geltungsbereich hat (Standardobjekt), wird eine Deklaration an das Fensterobjekt "angehängt".
Zum Beispiel:
var myvar = 'test';
Die globale Variable myvar ist dasselbe wie fenster.myvar o window['myvar']
Um Fehler beim Testen zu vermeiden, wenn eine globale Variable existiert, verwenden Sie besser:
if(window.myvar == undefined )
{
alert('var does not exists or is not initialized');
}
Die Frage, ob eine Variable wirklich existiert, spielt keine Rolle, ihr Wert ist falsch. Andernfalls ist es unsinnig, Variablen mit undefiniert zu initialisieren, und es ist besser, den Wert false zu verwenden, um zu initialisieren. Wenn Sie wissen, dass alle Variablen, die Sie deklarieren, mit false initialisiert werden, können Sie einfach ihren Typ überprüfen oder sich auf !window.myvar
um zu prüfen, ob er einen richtigen/gültigen Wert hat. Selbst wenn die Variable also nicht definiert ist, wird !window.myvar
ist dasselbe für myvar = undefined
o myvar = false
o myvar = 0
.
Wenn Sie einen bestimmten Typ erwarten, testen Sie den Typ der Variablen. Um das Testen einer Bedingung zu beschleunigen, sollten Sie dies tun:
if( !window.myvar || typeof window.myvar != 'string' )
{
alert('var does not exists or is not type of string');
}
Wenn die erste und einfache Bedingung erfüllt ist, überspringt der Interpreter die nächsten Tests.
Es ist immer besser, die Instanz/das Objekt der Variablen zu verwenden, um zu prüfen, ob sie einen gültigen Wert erhalten hat. Das ist stabiler und eine bessere Art der Programmierung.
(y)
ECMAScript 10 eine neue Funktion eingeführt - optionale Verkettung die Sie verwenden können, um eine Eigenschaft eines Objekts nur dann zu verwenden, wenn ein Objekt wie dieses definiert ist:
const userPhone = user?.contactDetails?.phone;
Es wird nur auf die Eigenschaft phone verwiesen, wenn user und contactDetails definiert sind.
Ref. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
In dem Artikel Erforschung der Abgründe von Null und Undefiniert in JavaScript Ich habe gelesen, dass Frameworks wie Underscore.js diese Funktion verwenden:
function isUndefined(obj){
return obj === void 0;
}
Einfach alles, was nicht in JavaScript definiert ist, ist undefiniert spielt es keine Rolle, ob es sich um eine Eigenschaft innerhalb einer Objekt/Array oder nur als einfache Variable...
JavaScript hat typeof
die es sehr einfach machen, eine undefinierte Variable zu erkennen.
Prüfen Sie einfach, ob typeof whatever === 'undefined'
und gibt einen booleschen Wert zurück.
Auf diese Weise wird die berühmte Funktion isUndefined()
in AngularJs v.1x geschrieben wird:
function isUndefined(value) {return typeof value === 'undefined';}
Sie sehen also, dass die Funktion einen Wert erhält, und wenn dieser Wert definiert ist, gibt sie zurück false
, andernfalls für undefinierte Werte, Rückgabe true
.
Schauen wir uns also an, was die Ergebnisse sein werden, wenn wir Werte übergeben, einschließlich Objekteigenschaften wie unten, das ist die Liste der Variablen, die wir haben:
var stackoverflow = {};
stackoverflow.javascipt = 'javascript';
var today;
var self = this;
var num = 8;
var list = [1, 2, 3, 4, 5];
var y = null;
und wir überprüfen sie wie unten, Sie können die Ergebnisse vor ihnen als Kommentar sehen:
isUndefined(stackoverflow); //false
isUndefined(stackoverflow.javascipt); //false
isUndefined(today); //true
isUndefined(self); //false
isUndefined(num); //false
isUndefined(list); //false
isUndefined(y); //false
isUndefined(stackoverflow.java); //true
isUndefined(stackoverflow.php); //true
isUndefined(stackoverflow && stackoverflow.css); //true
Wie Sie sehen, können wir alles überprüfen, indem wir etwas wie dies in unserem Code verwenden, wie erwähnt können Sie einfach typeof
in Ihrem Code, aber wenn Sie es immer wieder verwenden, erstellen Sie eine Funktion wie die Angular-Beispiel, das ich teilen und halten Wiederverwendung als folgende DRY-Code-Muster.
Auch eine weitere Sache, für die Überprüfung der Eigenschaft auf ein Objekt in einer realen Anwendung, die Sie nicht sicher, ob das Objekt existiert oder nicht, überprüfen Sie, ob das Objekt zuerst existiert.
Wenn Sie eine Eigenschaft eines Objekts überprüfen und das Objekt nicht existiert, wird ein Fehler ausgelöst und die gesamte Anwendung wird angehalten.
isUndefined(x.css);
VM808:2 Uncaught ReferenceError: x is not defined(…)
So einfach können Sie in eine if-Anweisung wie unten einpacken:
if(typeof x !== 'undefined') {
//do something
}
Die auch gleich isDefined in Angular 1.x...
function isDefined(value) {return typeof value !== 'undefined';}
Auch andere Javascript-Frameworks wie underscore hat ähnliche definierende Prüfung, aber ich empfehle Ihnen, verwenden typeof
wenn Sie bereits keine Frameworks verwenden.
Ich füge auch diesen Abschnitt aus MDN hinzu, der nützliche Informationen über typeof, undefined und void(0) enthält.
Strenge Gleichheit und undefiniert
Sie können undefiniert und die strengen Gleichheits- und Ungleichheitsoperatoren verwenden, um festzustellen, ob eine Variable einen Wert hat. Im folgenden Code ist die Variable x nicht definiert, und die if-Anweisung wird als wahr ausgewertet.
var x;
if (x === undefined) {
// these statements execute
}
else {
// these statements do not execute
}
Hinweis: Der strenge Gleichheitsoperator und nicht der Standard-Gleichheitsoperator Operator verwendet werden, da x == undefiniert auch prüft, ob x null ist, während dies bei strikter Gleichheit nicht der Fall ist. null ist nicht äquivalent zu undefiniert. Siehe Vergleichsoperatoren für Details.
Typeof-Operator und undefiniert
Alternativ kann auch typeof verwendet werden:
var x;
if (typeof x === 'undefined') {
// these statements execute
}
Ein Grund für die Verwendung von typeof ist, dass es keinen Fehler auslöst, wenn die Variable nicht deklariert wurde.
// x has not been declared before
if (typeof x === 'undefined') { // evaluates to true without errors
// these statements execute
}
if (x === undefined) { // throws a ReferenceError
}
Diese Art von Technik sollte jedoch vermieden werden. JavaScript ist ein statisch skalierte Sprache, so dass man wissen kann, ob eine Variable deklariert ist ob sie in einem umgebenden Kontext deklariert ist. Die einzige Ausnahme ist der globale Bereich, aber der ist an das globale Objekt gebunden. das globale Objekt gebunden, so dass das Vorhandensein einer Variablen im globalen Kontext überprüft werden kann, indem man die Existenz einer Eigenschaft auf des globalen Objekts (z. B. mit dem in-Operator).
Void-Operator und undefiniert
Eine dritte Möglichkeit ist der Operator void.
var x;
if (x === void 0) {
// these statements execute
}
// y has not been declared before
if (y === void 0) {
// throws a ReferenceError (in contrast to `typeof`)
}
mehr > ici
Wenn ich mir das hier durchlese, bin ich erstaunt, dass ich das nicht gesehen habe. Ich habe mehrere Algorithmen gefunden, die dafür funktionieren würden.
Nie definiert
Wenn der Wert eines Objekts nie definiert wurde, verhindert dies die Rückgabe von true
wenn sie definiert ist als null
o undefined
. Dies ist hilfreich, wenn Sie wollen, dass true für Werte zurückgegeben wird, die als undefined
if(obj.prop === void 0) console.log("The value has never been defined");
Definiert als undefiniert oder nie Definiert
Wenn Sie das Ergebnis als true
für Werte, die mit dem Wert von undefined
oder nie definiert, können Sie einfach === undefined
if(obj.prop === undefined) console.log("The value is defined as undefined, or never defined");
Definiert als Falsy-Wert, undefiniert, null oder nie definiert.
Häufig wurde ich nach einem Algorithmus gefragt, mit dem man herausfinden kann, ob ein Wert entweder falsch oder fehlerhaft ist, undefined
o null
. Die folgenden Werke.
if(obj.prop == false || obj.prop === null || obj.prop === undefined) {
console.log("The value is falsy, null, or undefined");
}