Wie kann am besten überprüft werden, ob eine Objekteigenschaft in JavaScript vorhanden ist undefined
?
quelle
Wie kann am besten überprüft werden, ob eine Objekteigenschaft in JavaScript vorhanden ist undefined
?
Die übliche Methode, um zu überprüfen, ob der Wert einer Eigenschaft der Sonderwert ist undefined
, ist:
if(o.myProperty === undefined) {
alert("myProperty value is the special value `undefined`");
}
So überprüfen Sie, ob ein Objekt tatsächlich nicht über eine solche Eigenschaft verfügt und daher undefined
standardmäßig zurückgegeben wird, wenn Sie versuchen, darauf zuzugreifen:
if(!o.hasOwnProperty('myProperty')) {
alert("myProperty does not exist");
}
Überprüfen, ob der einem Bezeichner zugeordnete Wert der Sonderwert undefined
ist oder ob dieser Bezeichner nicht deklariert wurde. Hinweis: Diese Methode ist die einzige Möglichkeit, ohne einen frühen Fehler auf einen nicht deklariertenundefined
Bezeichner (Hinweis: anders als mit einem Wert von ) zu verweisen :
if(typeof myVariable === 'undefined') {
alert('myVariable is either the special value `undefined`, or it has not been declared');
}
In JavaScript-Versionen vor ECMAScript 5 war die Eigenschaft "undefined" für das globale Objekt beschreibbar und daher eine einfache Überprüfung foo === undefined
unerwartet verhalten, wenn sie versehentlich neu definiert wurde. In modernem JavaScript ist die Eigenschaft schreibgeschützt.
In modernem JavaScript ist "undefiniert" jedoch kein Schlüsselwort. Daher können Variablen in Funktionen als "undefiniert" bezeichnet werden und die globale Eigenschaft beschatten.
Wenn Sie sich über diesen (unwahrscheinlichen) Randfall Sorgen machen, können Sie den void-Operator verwenden , um den speziellen undefined
Wert selbst zu erhalten:
if(myVariable === void 0) {
alert("myVariable is the special value `undefined`");
}
obj !== undefined
jetzt verwenden.undefined
Früher war es veränderlich,undefined = 1234
was interessante Ergebnisse bringen würde. Nach Ecmascript 5 ist es jedoch nicht mehr beschreibbar, sodass wir die einfachere Version verwenden können. codereadability.com/how-to-check-for-undefined-in-javascriptIch glaube, es gibt eine Reihe falscher Antworten auf dieses Thema. Entgegen der allgemeinen Meinung ist "undefiniert" kein Schlüsselwort in JavaScript und kann tatsächlich einem Wert zugewiesen werden.
Richtiger Code
Der robusteste Weg, um diesen Test durchzuführen, ist:
Dies gibt immer das richtige Ergebnis zurück und behandelt sogar die Situation, in der
myVar
nicht deklariert ist.Code entartet. VERWENDE NICHT.
Darüber hinaus
myVar === undefined
wird ein Fehler in der Situation ausgelöst, in der myVar nicht deklariert ist.quelle
=== undefined
Verwirrung zu stiften. Ja, Sie können zuweisenundefined
, aber es gibt keinen legitimen Grund dafür, und es ist vorhersehbar, dass dies Ihren Code beschädigen kann. In C können Sie#define true false
, und in Python können Sie zuweisenTrue
undFalse
, aber die Leute fühlen sich nicht die Notwendigkeit , ihren Code in diesen Sprachen so zu gestalten , wie zum Schutz gegen die Möglichkeit , mich bewusst ihre eigene Umgebung an anderer Stelle im Code zu sabotieren . Warum ist die Möglichkeit der Zuordnung hierundefined
überhaupt erwägenswert?void 0
daran, dass Sie immer tun können , um den Wert zu erhalten,undefined
auf den gezeigt wird. So können Sie tunif (myVar === void 0)
. Das0
ist nichts Besonderes, man kann dort buchstäblich jeden Ausdruck setzen.undefined
. MDN: undefiniertObwohl dies von vielen anderen Antworten vehement empfohlen wird,
typeof
ist es eine schlechte Wahl . Es sollte niemals zur Überprüfung verwendet werden, ob Variablen den Wert habenundefined
, da es als kombinierte Überprüfung für den Wertundefined
und für die Existenz einer Variablen dient. In den allermeisten Fällen wissen Sie, wann eine Variable vorhanden ist, undtypeof
können nur dann einen stillen Fehler verursachen, wenn Sie im Variablennamen oder im Zeichenfolgenliteral einen Tippfehler machen'undefined'
.Wenn Sie also keine Feature-Erkennung² durchführen, bei der Ungewissheit besteht, ob ein bestimmter Name in den Geltungsbereich fällt (z. B. das Überprüfen
typeof module !== 'undefined'
als Schritt in Code, der für eine CommonJS-Umgebung spezifisch ist),typeof
ist dies eine schädliche Wahl, wenn es für eine Variable verwendet wird, und die richtige Option ist um den Wert direkt zu vergleichen:Einige häufige Missverständnisse sind:
Das Lesen einer nicht initialisierten Variablen (
var foo
) oder eines Parameters (function bar(foo) { … }
als bezeichnetbar()
) schlägt fehl. Dies ist einfach nicht wahr - Variablen ohne explizite Initialisierung und Parameter, denen keine Werte zugewiesen wurdenundefined
, werden immer und sind immer im Geltungsbereich.das
undefined
kann überschrieben werden. Das ist 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 ist diese Eigenschaft jedoch schreibgeschützt und nicht konfigurierbar . Kein moderner Browser erlaubt es, dieundefined
Eigenschaft zu ändern, und seit 2017 ist dies schon lange der Fall. Das Fehlen eines strengen Modus wirkt sich auch nicht aufundefined
das Verhalten aus - es werden nur Aussagen gemacht,undefined = 5
die nichts tun, anstatt zu werfen. Da es sich jedoch nicht um ein Schlüsselwort handelt, können Sie Variablen mit dem Namen deklarierenundefined
, und diese Variablen können geändert werden, wodurch dieses einmal übliche Muster entsteht:mehr gefährlicher als die globale Verwendung
undefined
. Wenn Sie ES3-kompatibel sein müssen, ersetzen Sieundefined
durchvoid 0
- greifen Sie nicht darauf zurücktypeof
. (warvoid
schon immer ein unärer Operator, der für jeden Operanden den undefinierten Wert ergibt.)Mit der Funktionsweise von Variablen ist es an der Zeit, die eigentliche Frage zu beantworten: Objekteigenschaften. Es gibt keinen Grund, jemals
typeof
Objekteigenschaften zu verwenden. Die frühere Ausnahme zur Feature-Erkennung gilt hier nicht - sie hattypeof
nur ein spezielles Verhalten für Variablen, und Ausdrücke, die auf Objekteigenschaften verweisen, sind keine Variablen.Diese:
ist immer genau gleichbedeutend mit diesem³:
und unter Berücksichtigung der obigen Ratschläge, um zu vermeiden, dass die Leser verwirrt werden, warum Sie sie verwenden
typeof
, da es am sinnvollsten ist, die===
Gleichheit zu überprüfen, weil sie später überarbeitet werden könnte, um den Wert einer Variablen zu überprüfen, und weil dies einfach ist sieht besser aus, du solltest auch hier immer=== undefined
³ verwenden .Wenn es um Objekteigenschaften geht, sollten Sie auch berücksichtigen, ob Sie wirklich nachsehen möchten
undefined
. Ein bestimmter Eigenschaftsname kann auf einem Objekt fehlen (den Wertundefined
beim Lesen erzeugen ), auf dem Objekt selbst mit dem Wertundefined
vorhanden sein, auf dem Prototyp des Objekts mit dem Wert vorhanden sein oder auf einem der Objekteundefined
mit einem Nichtwert vorhandenundefined
sein.'key' in obj
Hier erfahren Sie, ob sich ein Schlüssel irgendwo in der Prototypenkette eines Objekts befindet, undObject.prototype.hasOwnProperty.call(obj, 'key')
ob er sich direkt auf dem Objekt befindet. Ich werde in dieser Antwort auf Prototypen und die Verwendung von Objekten als Karten mit Zeichenfolgen nicht näher darauf eingehen, da sie hauptsächlich dazu gedacht sind, allen schlechten Ratschlägen in anderen Antworten entgegenzuwirken, unabhängig von den möglichen Interpretationen der ursprünglichen Frage. Lesen Sie weiterObjektprototypen auf MDN für mehr!¹ ungewöhnliche Wahl des Beispielvariablennamens? Dies ist wirklich toter Code aus der NoScript-Erweiterung für Firefox.
² Gehen Sie jedoch nicht davon aus, dass es im Allgemeinen in Ordnung ist, nicht zu wissen, was in den Geltungsbereich fällt. Bonusanfälligkeit durch Missbrauch des dynamischen Bereichs: Project Zero 1225
³ setzt erneut eine ES5 + -Umgebung voraus und
undefined
bezieht sich auf dieundefined
Eigenschaft des globalen Objekts.void 0
sonst ersetzen .quelle
undefined
und den Standardkontext ausblenden. Was für die meisten praktischen Zwecke den gleichen Effekt hat wie das Überschreiben.void 0
mit undefinierten vergleichen, aber wieder - das ist albern und übertrieben.typeof something === "undefined")
im Code zu sehen.void 0
ist ( ausnahmsweise ) sowohl kürzer als auch sicherer! Das ist ein Gewinn in meinem Buch.In JavaScript gibt es null und es ist undefiniert . Sie haben unterschiedliche Bedeutungen.
Marijn Haverbeke erklärt in seinem kostenlosen Online-Buch " Eloquent JavaScript " (Schwerpunkt Mine):
Ich denke, der beste Weg, um zu überprüfen, ob etwas undefiniert war, wäre:
Hoffe das hilft!
Bearbeiten: Als Reaktion auf Ihre Bearbeitung sollten die Objekteigenschaften auf die gleiche Weise funktionieren.
quelle
undefined
ist nur eine Variable, die vom Benutzer neu zugewiesen werden kann: Das Schreibenundefined = 'a';
führt dazu, dass Ihr Code nicht mehr das tut, was Sie denken. Die Verwendungtypeof
ist besser und funktioniert auch für Variablen (nicht nur Eigenschaften), die nicht deklariert wurden.Was bedeutet das: "undefinierte Objekteigenschaft" ?
Eigentlich kann es zwei ganz verschiedene Dinge bedeuten! Erstens kann es sich um die Eigenschaft handeln, die noch nie im Objekt definiert wurde, und zweitens um die Eigenschaft, die einen undefinierten Wert hat . Schauen wir uns diesen Code an:
Ist
o.a
undefiniert? Ja! Sein Wert ist undefiniert. Isto.b
undefiniert? Sicher! Es gibt überhaupt keine Eigenschaft 'b'! OK, sehen Sie jetzt, wie sich unterschiedliche Ansätze in beiden Situationen verhalten:Wir können das klar erkennen
typeof obj.prop == 'undefined'
undobj.prop === undefined
sind gleichwertig, und sie unterscheiden diese verschiedenen Situationen nicht. Und'prop' in obj
kann die Situation erkennen, in der eine Eigenschaft überhaupt nicht definiert wurde und nicht auf den möglicherweise undefinierten Eigenschaftswert achtet.Was tun?
1) Sie möchten wissen, ob eine Eigenschaft nicht durch die erste oder zweite Bedeutung definiert ist (die typischste Situation).
2) Sie möchten nur wissen, ob das Objekt eine Eigenschaft hat, und sich nicht um seinen Wert kümmern.
Anmerkungen:
x.a === undefined
oder dies wird beispielsweisetypeof x.a == 'undefined'
ausgelöst,ReferenceError: x is not defined
wenn x nicht definiert ist.undefined
ist eine globale Variable (also tatsächlichwindow.undefined
in Browsern). Es wird seit ECMAScript 1st Edition unterstützt und ist seit ECMAScript 5 schreibgeschützt . In modernen Browsern kann es nicht neu definiert werden, da viele Autoren uns gerne erschrecken, aber dies gilt immer noch für ältere Browser.Endkampf:
obj.prop === undefined
vs.typeof obj.prop == 'undefined'
Pluspunkte von
obj.prop === undefined
:undefined
Minuspunkte von
obj.prop === undefined
:undefined
kann in alten Browsern überschrieben werdenPluspunkte von
typeof obj.prop == 'undefined'
:Minuspunkte von
typeof obj.prop == 'undefined'
:'undefned'
( falsch geschrieben ) Hier ist nur eine Zeichenfolgenkonstante, daher kann Ihnen die JavaScript-Engine nicht helfen, wenn Sie sie wie ich falsch geschrieben haben.Update (für serverseitiges JavaScript):
Node.js unterstützt die globale Variable
undefined
asglobal.undefined
(sie kann auch ohne das Präfix 'global' verwendet werden). Ich kenne keine anderen Implementierungen von serverseitigem JavaScript.quelle
undefined
als Mitglied vonglobal
. Weder auchconsole.log(global);
nochfor (var key in global) { ... }
nicht zeigen nicht definiert als Mitglied des globalen . Aber teste gerne'undefined' in global
das Gegenteil.[[Enumerable]]
das falsch ist :-)Minuses of typeof obj.prop == 'undefined'
, kann dies durch das Schreiben wie vermieden werdentypeof obj.prop == typeof undefined
. Dies ergibt auch eine sehr schöne Symmetrie.obj.prop === undefined
.if ('foo' in o
)… Ihre Antwort ist wirklich die erste richtige Antwort hier. So ziemlich alle anderen beantworten nur diesen Satz.Das Problem besteht aus drei Fällen:
undefined
.undefined
.Dies sagt uns etwas, was ich für wichtig halte:
Es gibt einen Unterschied zwischen einem undefinierten Element und einem definierten Element mit einem undefinierten Wert.
Aber unglücklicherweise
typeof obj.foo
sagt uns nicht, welchen der drei Fälle wir haben. Wir können dies jedoch kombinieren"foo" in obj
, um die Fälle zu unterscheiden.Es ist erwähnenswert, dass diese Tests auch für
null
Einträge gleich sindIch würde argumentieren, dass es in einigen Fällen sinnvoller (und klarer) ist, zu überprüfen, ob die Eigenschaft vorhanden ist, als zu überprüfen, ob sie undefiniert ist, und der einzige Fall, in dem diese Überprüfung anders sein wird, ist Fall 2, der seltene Fall von Ein tatsächlicher Eintrag im Objekt mit einem undefinierten Wert.
Beispiel: Ich habe gerade eine Reihe von Codes überarbeitet, bei denen überprüft wurde, ob ein Objekt eine bestimmte Eigenschaft hat.
Was klarer war, wenn ohne Prüfung auf undefiniert geschrieben wurde.
Aber wie bereits erwähnt, sind diese nicht genau gleich (aber mehr als gut genug für meine Bedürfnisse).
quelle
if (!("x" in blob)) {}
mit Klammern um das In sagen , weil das! Der Operator hat Vorrang vor 'in'. Hoffe das hilft jemandem.a = {b: undefined}
; danntypeof a.b === typeof a.c === 'undefined'
aber'b' in a
und!('c' in a)
.{ x : undefined }
oder ihn zumindest als eine andere Alternative zu (2.) in der Tabelle hinzuzufügen - ich musste einen Moment nachdenken, um zu erkennen, dass Punkt (2.)undefined
(obwohl ) bewertet wird Sie erwähnen das später).Das hat bei mir funktioniert, die anderen nicht.
quelle
typeof (something == "undefined")
.(typeof something) === "undefined"
.Ich bin mir nicht sicher, woher der Ursprung der Verwendung
===
mittypeof
stammt, und als Konvention sehe ich, dass er in vielen Bibliotheken verwendet wird, aber der Operator typeof gibt ein Zeichenfolgenliteral zurück, und wir wissen das im Voraus. Warum sollten Sie also auch tippen? Überprüfen Sie es auch?quelle
==
erfordert immer noch mindestens eine Typprüfung - der Interpreter kann die beiden Operanden nicht vergleichen, ohne vorher ihren Typ zu kennen.==
ist ein Zeichen weniger als===
:)Crossposting meiner Antwort von einer verwandten Frage Wie kann ich in JavaScript nach "undefiniert" suchen?
Speziell für diese Frage siehe Testfälle mit
someObject.<whatever>
.Einige Szenarien, die die Ergebnisse der verschiedenen Antworten veranschaulichen: http://jsfiddle.net/drzaus/UVjM4/
(Beachten Sie, dass die Verwendung von
var
fürin
Tests in einem Wrapper mit Gültigkeitsbereich einen Unterschied macht.)Code als Referenz:
Und Ergebnisse:
quelle
Wenn Sie tun
Es
myvar
schlägt fehl, wenn die Variable nicht vorhanden ist, da myvar nicht definiert ist. Daher ist das Skript fehlerhaft und der Test hat keine Auswirkung.Da das Fensterobjekt einen globalen Bereich (Standardobjekt) außerhalb einer Funktion hat, wird eine Deklaration an das Fensterobjekt angehängt.
Zum Beispiel:
Die globale Variable myvar ist dieselbe wie window.myvar oder window ['myvar']
Um Fehler beim Testen zu vermeiden, wenn eine globale Variable vorhanden ist, verwenden Sie besser:
Die Frage, ob eine Variable wirklich existiert, spielt keine Rolle, ihr Wert ist falsch. Andernfalls ist es dumm, Variablen mit undefined zu initialisieren, und es ist besser, den Wert false zum Initialisieren zu verwenden. Wenn Sie wissen, dass alle von Ihnen deklarierten Variablen mit false initialisiert sind, können Sie einfach ihren Typ überprüfen oder sich darauf verlassen
!window.myvar
, ob sie einen richtigen / gültigen Wert haben. Selbst wenn die Variable nicht definiert ist,!window.myvar
ist sie fürmyvar = undefined
odermyvar = false
oder gleichmyvar = 0
.Wenn Sie einen bestimmten Typ erwarten, testen Sie den Typ der Variablen. Um das Testen einer Bedingung zu beschleunigen, sollten Sie Folgendes tun:
Wenn die erste und einfache Bedingung erfüllt ist, überspringt der Dolmetscher die nächsten Tests.
Es ist immer besser, die Instanz / das Objekt der Variablen zu verwenden, um zu überprüfen, ob sie einen gültigen Wert hat. Es ist stabiler und eine bessere Art der Programmierung.
(y)
quelle
Ich habe niemanden gesehen (ich hoffe, ich habe ihn nicht verpasst), der das Objekt vor dem Grundstück überprüft hat. Dies ist also die kürzeste und effektivste (wenn auch nicht unbedingt die klarste):
Wenn obj oder obj.prop undefiniert, null oder "falsch" ist, führt die if-Anweisung den Codeblock nicht aus. Dies ist normalerweise das gewünschte Verhalten in den meisten Codeblockanweisungen (in JavaScript).
quelle
var x = obj && obj.prop || 'default';
In dem Artikel Exploring the Abyss of Null und Undefined in JavaScript habe ich gelesen, dass Frameworks wie Underscore.js diese Funktion verwenden:
quelle
void 0
ist nur eine kurze Schreibweiseundefined
(da dies die Leere ist, gefolgt von einem Ausdruck), werden 3 Zeichen gespeichert. Es könnte auch funktionierenvar a; return obj === a;
, aber das ist noch ein Charakter. :-)void
ist ein reserviertes Wort, währendundefined
nicht das heißt, währendundefined
heißt auf gleichvoid 0
standardmäßig Sie einen Wert zuweisen könnenundefined
zBundefined = 1234
.isUndefined(obj)
: 16 Zeichen.obj === void 0
: 14 Zeichen. 'nough sagte.Einfach ist nichts in JavaScript definiert, undefiniert , egal ob es sich um eine Eigenschaft innerhalb eines Objekts / Arrays handelt oder nur um eine einfache Variable ...
JavaScript hat
typeof
es sehr einfach, eine undefinierte Variable zu erkennen.Überprüfen Sie einfach, ob
typeof whatever === 'undefined'
Sie und es wird ein Boolescher Wert zurückgegeben.So wird die berühmte Funktion
isUndefined()
in AngularJs v.1x geschrieben:Wenn Sie also sehen, dass die Funktion einen Wert erhält, wird dieser Wert zurückgegeben, wenn er definiert ist
false
. Andernfalls wird für undefinierte Werte zurückgegebentrue
.Schauen wir uns also an, was die Ergebnisse sein werden, wenn wir Werte übergeben, einschließlich Objekteigenschaften wie unten. Dies ist die Liste der Variablen, die wir haben:
und wir überprüfen sie wie folgt, Sie können die Ergebnisse vor ihnen als Kommentar sehen:
Wie Sie sehen, können wir alles überprüfen, indem wir so etwas in unserem Code verwenden. Wie bereits erwähnt, können Sie es einfach
typeof
in Ihrem Code verwenden. Wenn Sie es jedoch immer wieder verwenden, erstellen Sie eine Funktion wie das eckige Beispiel, das ich teile, und verwenden Sie es weiterhin als folgendes DRY-Code-Muster.Wenn Sie die Eigenschaft eines Objekts in einer realen Anwendung überprüfen möchten, bei der Sie nicht sicher sind, ob das Objekt vorhanden ist oder nicht, überprüfen Sie zunächst, ob das Objekt zuerst vorhanden ist.
Wenn Sie eine Eigenschaft für ein Objekt überprüfen und das Objekt nicht vorhanden ist, wird ein Fehler ausgegeben und die Ausführung der gesamten Anwendung gestoppt.
So einfach können Sie eine if-Anweisung wie folgt einschließen:
Was auch gleich isDefined in Angular 1.x ist ...
Auch andere Javascript-Frameworks wie der Unterstrich haben eine ähnliche Definitionsprüfung. Ich empfehle jedoch die Verwendung,
typeof
wenn Sie bereits keine Frameworks verwenden.Ich füge auch diesen Abschnitt von MDN hinzu, der nützliche Informationen über typeof, undefined und void (0) enthält.
mehr> hier
quelle
' if (window.x) {} ' ist fehlersicher
Höchstwahrscheinlich möchten Sie
if (window.x)
. Diese Prüfung ist auch dann sicher, wenn x nicht deklariert wurde (var x;
) - der Browser gibt keinen Fehler aus.Beispiel: Ich möchte wissen, ob mein Browser die Verlaufs-API unterstützt
So funktioniert das:
window ist ein Objekt, das alle globalen Variablen als Mitglieder enthält, und es ist zulässig, auf ein nicht vorhandenes Mitglied zuzugreifen. Wenn x nicht deklariert wurde , ist oder nicht gesetzt wurde dann
window.x
zurückgibt undefiniert . undefined führt zu false, wenn if () es auswertet.quelle
typeof history != 'undefined'
funktioniert tatsächlich in beiden Systemen.Ich bin 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, wird die Rückgabe verhindert,
true
wenn es alsnull
oder definiert istundefined
. Dies ist hilfreich, wenn für Werte, die als festgelegt sind, true zurückgegeben werden sollundefined
Definiert als undefiniert oder nie definiert
Wenn Sie möchten, dass es sich
true
um Werte handelt, die mit dem Wert vonundefined
definiert oder nie definiert wurden, können Sie einfach verwenden=== undefined
Definiert als falscher Wert, undefiniert, null oder nie definiert.
Im Allgemeinen haben mich Leute nach einem Algorithmus gefragt, um herauszufinden, ob ein Wert entweder falsch
undefined
ist odernull
. Folgendes funktioniert.quelle
if (!obj.prop)
var obj = {foo: undefined}; obj.foo === void 0
->true
. Wie ist das "nie definiert alsundefined
"? Das ist falsch.quelle
Vergleichen Sie mit
void 0
, für die Knappheit.Es ist nicht so ausführlich wie
if (typeof foo !== 'undefined')
quelle
foo
es nicht deklariert ist.Die Lösung ist falsch. In JavaScript
wird true zurückgeben, da beide in einen Booleschen Wert "umgewandelt" und false sind. Der richtige Weg wäre zu überprüfen
Welches ist der Identitätsoperator ...
quelle
===
ist Typ Gleichheit + (primitive Gleichheit | Objektidentität), wobei Primitive Zeichenfolgen enthalten. Ich denke, die meisten Leute halten es für nicht'abab'.slice(0,2) === 'abab'.slice(2)
intuitiv, wenn man es===
als Identitätsoperator betrachtet.Mit dem folgenden Code können Sie ein Array erhalten, das alle undefiniert mit Pfad ist.
jsFiddle Link
quelle
getUndefiend
sollte seingetUndefined
.Hier ist meine Situation:
Ich verwende das Ergebnis eines REST-Aufrufs. Das Ergebnis sollte von JSON in ein JavaScript-Objekt analysiert werden.
Es gibt einen Fehler, den ich verteidigen muss. Wenn die Argumente für den Restaufruf falsch waren, sofern der Benutzer die Argumente falsch angegeben hat, wird der Restaufruf im Grunde genommen leer zurückgegeben.
Während ich diesen Beitrag benutzte, um mich dagegen zu verteidigen, habe ich es versucht.
In meiner Situation kann ich, wenn restResult.data [0] === "object" ist, sicher damit beginnen, den Rest der Mitglieder zu inspizieren. Wenn undefiniert, werfen Sie den Fehler wie oben.
Was ich damit sagen will ist, dass für meine Situation alle oben genannten Vorschläge in diesem Beitrag nicht funktioniert haben. Ich sage nicht, dass ich Recht habe und jeder Unrecht hat. Ich bin überhaupt kein JavaScript-Meister, aber hoffentlich hilft dies jemandem.
quelle
typeof
Wache schützt sich eigentlich nicht vor etwas, mit dem ein direkter Vergleich nicht umgehen kann. WennrestResult
es nicht definiert oder nicht deklariert ist, wird es trotzdem werfen.if(!restResult.data.length) { throw "Some error"; }
Es gibt eine schöne und elegante Möglichkeit, einer neuen Variablen eine definierte Eigenschaft zuzuweisen, wenn sie definiert ist, oder ihr einen Standardwert als Fallback zuzuweisen, wenn sie nicht definiert ist.
Es ist geeignet, wenn Sie eine Funktion haben, die eine zusätzliche Konfigurationseigenschaft erhält:
Jetzt ausführen
quelle
Alle Antworten sind unvollständig. Dies ist der richtige Weg, um zu wissen, dass es eine Eigenschaft gibt, die als undefiniert definiert ist:
Beispiel:
Schade, dass dies die richtige Antwort war, ist in falschen Antworten> _ <begraben
Also, für jeden, der vorbeikommt, werde ich Ihnen undefinierte kostenlos geben !!
quelle
Wenn Sie die Kommentare durchgehen, ist es für diejenigen, die beide überprüfen möchten, undefiniert oder der Wert ist null:
Wenn Sie jQuery Library verwenden
jQuery.isEmptyObject()
, reicht dies für beide Fälle aus:quelle
Wenn Sie Angular verwenden:
Underscore.js:
quelle
1
Variable hinzux
? Benötige ich Unterstrich oder jQuery? (Erstaunlich, dass die Leute Bibliotheken selbst für die elementarsten Operationen wie einentypeof
Scheck benutzen )Ich benutze
if (this.variable)
, um zu testen, ob es definiert ist. Einfachif (variable)
, oben empfohlen , schlägt für mich fehl. Es stellt sich heraus, dass es nur funktioniert, wenn Variable ein Feld eines Objekts ist, umobj.someField
zu überprüfen, ob es im Wörterbuch definiert ist. Aber wir könnenthis
oderwindow
als Wörterbuchobjekt verwenden, da jede Variable ein Feld im aktuellen Fenster ist, so wie ich es verstehe. Deshalb hier ein TestEs erkennt zuerst, dass die Variable
abc
undefiniert ist und wird nach der Initialisierung definiert.quelle
Ich biete hier drei Möglichkeiten für diejenigen, die seltsame Antworten erwarten:
isUndefined1:
Versuchen Sie, eine Eigenschaft des Eingabewerts abzurufen, und überprüfen Sie die Fehlermeldung, falls vorhanden. Wenn der Eingabewert undefiniert ist, lautet die Fehlermeldung Uncaught TypeError: Die Eigenschaft 'b' von undefined kann nicht gelesen werden
isUndefined2:
Konvertieren Sie den Eingabewert in einen String, mit dem Sie vergleichen möchten
"undefined"
und stellen Sie sicher, dass er negativ ist.isUndefined3:
In js funktioniert der optionale Parameter, wenn der Eingabewert genau ist
undefined
.quelle
Gibt false zurück, wenn die Variable festgelegt ist, und true, wenn sie nicht definiert ist.
Dann benutze:
quelle
typeof
Test nicht sinnvoll in eine Funktion einschließen können. Erstaunlich, dass 4 Leute dies positiv bewertet haben. -1.Ich möchte Ihnen etwas zeigen, das ich zum Schutz der
undefined
Variablen verwende:Dies verbietet jedem, den
window.undefined
Wert zu ändern, wodurch der auf dieser Variablen basierende Code zerstört wird. Bei Verwendung"use strict"
endet alles, was versucht, seinen Wert zu ändern, mit einem Fehler, andernfalls wird es stillschweigend ignoriert.quelle
Sie können auch Proxy verwenden. Es funktioniert mit verschachtelten Aufrufen, erfordert jedoch eine zusätzliche Überprüfung:
Sie werden es also wie folgt verwenden:
quelle
Von lodash.js.
Es wird eine LOCAL-Variable mit dem Namen erstellt,
undefined
die mit dem Standardwert initialisiert wird - dem Realwert -undefined
und dannvalue
mit der Variablen verglichen wirdundefined
.Update 09.09.2019
Ich fand lodash aktualisiert seine Implementierung. Siehe mein Problem und den Code .
Um kugelsicher zu sein, verwenden Sie einfach:
quelle