Welche Methode zur Überprüfung, ob eine Variable initialisiert wurde, ist besser / korrekt? (Angenommen, die Variable kann alles enthalten (Zeichenfolge, Int, Objekt, Funktion usw.))
if (elem) { // or !elem
oder
if (typeof(elem) !== 'undefined') {
oder
if (elem != null) {
javascript
variables
initialization
undefined
Samuel Liew
quelle
quelle
foo
deklariert ist, entwedertypeof foo === 'undefined'
odertypeof foo === typeof undefined
undefined
. Die richtige Antwort ist diese: stackoverflow.com/a/36432729/772035hasOwnProperty('bar')
hat nicht die gleichen Mängel wie die anderen, würde aber einige Anpassungen für Node erfordern (ersetzenwindow
durchglobal
).Antworten:
Sie möchten den
typeof
Operator . Speziell:quelle
Der
typeof
Operator prüft, ob die Variable wirklich undefiniert ist.Der
typeof
Operator löst im Gegensatz zu den anderen Operatoren keine ReferenceError- Ausnahme aus, wenn er mit einer nicht deklarierten Variablen verwendet wird.Beachten Sie jedoch, dass dies
typeof null
zurückkehren wird"object"
. Wir müssen vorsichtig sein, um den Fehler zu vermeiden, eine Variable mit zu initialisierennull
. Um sicher zu gehen, könnten wir stattdessen Folgendes verwenden:Weitere Informationen zur Verwendung eines strengen Vergleichs
===
anstelle einer einfachen Gleichheit==
finden Sie unter:Welcher Gleichheitsoperator (== vs ===) sollte in JavaScript-Vergleichen verwendet werden?
quelle
if(! variable_here)
wird in vielen Fällen brechen. Wenn die Variable 0 oder falsch ist, schlägt sie fehl. Das willst du nicht.typeof foo === "undefined"
ist das richtig und besser als die am besten gewählte Antwort, aber die zusätzlichen Notizen machen diese Antwort nur verwirrend.In vielen Fällen wird Folgendes verwendet:
erledigt den Job für Sie! ... dies überprüft die folgenden Fälle:
undefined
''
Es werden also alle Fälle abgedeckt, aber es gibt immer seltsame Fälle, die wir auch behandeln möchten, zum Beispiel eine Zeichenfolge mit Leerzeichen, wie diese
' '
, die in Javascript definiert wird, da sie Leerzeichen innerhalb der Zeichenfolge enthält ... in diesem Fall fügen Sie beispielsweise mit trim () eine weitere Prüfung hinzu, wie z.Außerdem gelten diese Überprüfungen nur für Werte , da Objekte und Arrays in Javascript unterschiedlich funktionieren. Leeres Array
[]
und leeres Objekt{}
sind immer wahr .Ich erstelle das Bild unten, um einen kurzen Überblick über die Antwort zu geben:
quelle
if(elem)
, dass sie auf undefiniert prüft (während sie einen nicht definierten Fehler zurückgibt), nicht wahr?In JavaScript kann eine Variable definiert werden, die jedoch den Wert enthält
undefined
, sodass die häufigste Antwort technisch nicht korrekt ist und stattdessen Folgendes ausführt:Das kann für Ihre Zwecke ausreichen. Der folgende Test hat eine einfachere Semantik, die es einfacher macht, das Verhalten Ihres Codes genau zu beschreiben und es selbst zu verstehen (wenn Sie sich für solche Dinge interessieren):
Dies setzt natürlich voraus, dass Sie in einem Browser ausgeführt werden (wobei
window
ein Name für das globale Objekt angegeben ist). Aber wenn Sie mit solchen Globals herumspielen, befinden Sie sich wahrscheinlich in einem Browser. Subjektiv ist die Verwendung'name' in window
stilistisch konsistent mit der Verwendung,window.name
um sich auf Globale zu beziehen. Durch den Zugriff auf Globals als Eigenschaftenwindow
und nicht als Variablen können Sie die Anzahl der nicht deklarierten Variablen minimieren, auf die Sie in Ihrem Code verweisen (zum Vorteil des Flusens), und die Möglichkeit vermeiden, dass Ihr Global von einer lokalen Variablen überschattet wird. Wenn Globals Ihre Haut kriechen lassen, fühlen Sie sich möglicherweise wohler, wenn Sie sie nur mit diesem relativ langen Stock berühren.quelle
In den meisten Fällen würden Sie Folgendes verwenden:
Im Gegensatz zu einem einfachen
if (elem)
, ermöglicht es0
,false
,NaN
und''
, aber Spucknull
oderundefined
ihm einen guten, allgemeiner Test für das Vorhandensein eines Argument zu machen, oder Eigenschaft eines Objekts.Die anderen Prüfungen sind ebenfalls nicht falsch, sie haben nur unterschiedliche Verwendungszwecke:
if (elem)
: Kann verwendet werden , wennelem
ein Objekt sein, oder wenn garantiertfalse
,0
usw. „default“ Werte (daher gleichwertig betrachtetundefined
odernull
).typeof elem == 'undefined'
kann in Fällen verwendet werden, in denen eine Angabenull
eine eindeutige Bedeutung für eine nicht initialisierte Variable oder Eigenschaft hat.elem
nicht deklariert ist (dh keinevar
Anweisung, keine Eigenschaft vonwindow
oder kein Funktionsargument). Dies ist meiner Meinung nach ziemlich gefährlich, da Tippfehler unbemerkt vorbeiziehen können. Um dies zu vermeiden, lesen Sie die folgende Methode.Nützlich ist auch ein strenger Vergleich mit
undefined
:Da die globale
undefined
Variable jedoch mit einem anderen Wert überschrieben werden kann, ist es am besten, die Variableundefined
im aktuellen Bereich zu deklarieren, bevor Sie sie verwenden:Oder:
Ein sekundärer Vorteil dieser Methode besteht darin, dass JS-Minifizierer die
undefined
Variable auf ein einzelnes Zeichen reduzieren können , wodurch Sie jedes Mal einige Bytes sparen.quelle
undefined
. Ich denke nicht einmal, dass das in der Antwort erwähnenswert ist. Wahrscheinlich der schlechteste akzeptable Variablenname in ganz Javascript.window.
vor der Variablen, wenn diese im globalen Kontext verwendet wird. Dies ist nicht der beste Weg.void(0)
anstelle von verwendenundefined
.false
,0
usw. als ungültige Werte.Überprüfen Sie, ob
window
.hasOwnProperty
( "varname
" )Eine Alternative zur Fülle von
typeof
Antworten;Globale Variablen, die mit einer
var varname = value;
Anweisung im globalen Bereich deklariert wurdenAls solche die
hasOwnProperty()
Methode, diea
var
von "varname" wurde global deklariert, dh es ist eine Eigenschaft vonwindow
.Das Tolle daran
hasOwnProperty()
ist, dass wir beim Aufrufen keine Variable verwenden, die möglicherweise noch nicht deklariert ist - was natürlich in erster Linie das halbe Problem ist.Obwohl dies nicht immer die perfekte oder ideale Lösung ist, ist es unter bestimmten Umständen nur der Job!
Anmerkungen
Das Obige gilt für die
var
Definition einer Variablen , im Gegensatz zulet
:Der Vollständigkeit
const
halber : Konstanten sind per Definition nicht wirklich variabel (obwohl ihr Inhalt sein kann); relevanter:Da
let
Variablen oderconst
Konstanten niemals Eigenschaften eines Objekts sind, das diehasOwnProperty()
Methode geerbt hat , kann sie nicht zur Überprüfung ihrer Existenz verwendet werden.In Bezug auf die Verfügbarkeit und Verwendung von
hasOwnProperty()
:quelle
true
(z . B.window.hasOwnProperty('console')
odervar hop = "p";window.hasOwnProperty('hop')
).typeof
Antworten einfach übersehen.let
denen diese Variablen nicht als Eigenschaften deswindow
[oder eines anderen verfügbaren] Objekts verfügbar sind.hasOwnProperty
Tests auf das Vorhandensein von Eigenschaften , nicht von Variablen, und können daher nicht zum Erkennen von durch definierten Variablen verwendet werdenlet
.var
und ist in dieser Hinsicht nicht veraltet. Ich habe jedoch einen Hinweis hinzugefügt, in dem dargelegt wird, wie sich die Verwendung von unterscheidetlet
undconst
von der von unterscheidetvar
. Vielen Dank für Ihre Inspiration. zusammen erheben wir uns :)hasOwnProperty
sie nur auf die vorgeschriebene Weise verwendet werden kann, um das Vorhandensein vonvar
Variablen zu überprüfen . Es liest sich okay für mich.So überprüfen Sie, ob eine Variable vorhanden ist
Dies ist eine ziemlich kugelsichere Lösung zum Testen, ob eine Variable vorhanden ist und initialisiert wurde:
Es wird am häufigsten in Kombination mit einem ternären Operator verwendet , um einen Standard festzulegen, falls eine bestimmte Variable nicht initialisiert wurde:
Probleme mit der Kapselung
Leider können Sie Ihren Scheck nicht einfach in eine Funktion einkapseln.
Sie könnten daran denken, so etwas zu tun:
Dies führt jedoch zu einem Referenzfehler, wenn Sie z.
isset(foo)
und Variablefoo
wurde nicht definiert, da Sie eine nicht vorhandene Variable nicht an eine Funktion weitergeben können:Testen, ob Funktionsparameter undefiniert sind
Während unsere
isset
Funktion nicht verwendet werden kann, um zu testen, ob eine Variable existiert oder nicht (aus den oben erläuterten Gründen), können wir damit testen, ob die Parameter einer Funktion undefiniert sind:Obwohl kein Wert für
y
an function weitergegeben wird, funktionierttest
unsereisset
Funktion in diesem Zusammenhang einwandfrei, day
sie in functiontest
alsundefined
Wert bekannt ist.quelle
Es gibt eine andere kurze Möglichkeit, dies zu überprüfen, wenn Sie einfache Aufgaben und zugehörige Überprüfungen durchführen. Verwenden Sie einfach den bedingten (ternären) Operator.
Dies ist auch hilfreich, wenn Sie versuchen, die globale Variable mit Instanzzuweisung der Referenzvariablen zu deklarieren.
Wenn Sie überprüfen möchten, sollte die Variable nicht
undefined
oder seinnull
. Führen Sie dann die folgende Prüfung durch.Wenn die Variable deklariert ist und Sie den Wert überprüfen möchten, ist dies sogar einfach: und es würde zusammen ausgeführt
undefined
undnull
überprüft.quelle
typeof(booooo)
ist"undefined"
danntypeof(typeof boooooo)
ist"string"
undtypeof boooooo && true
ist immertrue
. @ John-Slegers 'Antwort ist so kurz wie möglich mit typeof.If you wanted to check variable shouldn't be undefined or null.
. Durch diesen Kommentar wird klargestellt, dass die Überprüfung der Variablendeklaration nicht durchgeführt werden soll. Das ist, um den Variablenwert zu überprüfen.Kurzer Weg zum Testen einer Variablen ist nicht deklariert (nicht undefiniert)
Ich fand es nützlich, um ein Skript zu erkennen, das außerhalb eines Browsers ausgeführt wird (ohne deklarierte
window
Variable).quelle
window.bar=undefined
wird definiert und auf einen Wert gesetzt. Ihre Antwort erkennt den Unterschied zwischen dieser und der nicht vorhandenen Variablen nicht. Wenn Sie das getanthis.hasOwnProperty('bar')
haben, könnte es funktioniert haben.const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();
. Variablex
ist definiert, aber false wird zurückgegeben ...Es hängt davon ab, ob Sie sich nur darum kümmern, dass die Variable definiert wurde, oder ob Sie möchten, dass sie einen aussagekräftigen Wert hat.
Wenn Sie überprüfen, ob der Typ undefiniert ist, wird überprüft, ob die Variable noch definiert wurde.
=== null
oder!== null
prüft nur, ob der Wert der Variablen genau istnull
.== null
oder!= null
prüft, ob der Wertundefined
oder istnull
.if(value)
prüft , ob die Variableundefined
,null
,0
, oder eine leere Zeichenfolge.quelle
Die höchste Antwort ist richtig, verwenden Sie typeof.
Ich wollte jedoch darauf hinweisen, dass JavaScript
undefined
veränderlich ist (aus irgendeinem gottlosen Grund). Wenn Sie also einfach nach prüfenvarName !== undefined
, kann dies nicht immer so erfolgen, wie Sie es erwarten, da sich andere Bibliotheken möglicherweise undefiniert geändert haben. Ein paar Antworten (zum Beispiel @ skalee's) scheinen es vorzuziehen, sie nicht zu verwendentypeof
, und das könnte einen in Schwierigkeiten bringen.Die "alte" Art, damit umzugehen, bestand darin, undefiniert als var zu deklarieren, um mögliche Stummschaltungen / Überschreitungen von auszugleichen
undefined
. Der beste Weg ist jedoch immer noch,typeof
da er das Überschreibenundefined
von anderem Code ignoriert . Vor allem, wenn Sie Code für den Einsatz in freier Wildbahn schreiben, bei dem wer weiß, was sonst noch auf der Seite ausgeführt werden könnte ...quelle
varName !== undefined
wird nur ein ReferenceError verursacht. Die Veränderlichkeit von spieltundefined
keine Rolle.undefined
ist dies eine schreibgeschützte Eigenschaft. Um jedoch kugelsicher zu sein, können Sie verwendentypeof mvVar === typeof void 0
.void 0
kehrtundefined
immer zurück.Oder besser
Funktioniert in allen Browsern
quelle
Um zur Debatte beizutragen, wenn ich weiß, dass die Variable eine Zeichenfolge oder ein Objekt sein sollte, bevorzuge ich immer
if (!variable)
, also überprüfe, ob sie falsch ist. Dies kann zu saubererem Code führen, so dass zum Beispiel:..kann reduziert werden auf:
quelle
''
Ihrer Lösung ist, wird es als undefiniert betrachtet, wenn es tatsächlich so definiert ist, dass es eine leere Zeichenfolge enthält.Es ist schwierig, zwischen undefiniert und null zu unterscheiden. Null ist ein Wert, den Sie einer Variablen zuweisen können, wenn Sie angeben möchten, dass die Variable keinen bestimmten Wert hat. Undefiniert ist ein spezieller Wert, der der Standardwert nicht zugewiesener Variablen ist.
quelle
Null ist ein Wert in JavaScript und gibt
typeof null
zurück"object"
Daher funktioniert die akzeptierte Antwort nicht, wenn Sie Nullwerte übergeben. Wenn Sie Nullwerte übergeben, müssen Sie eine zusätzliche Prüfung für Nullwerte hinzufügen:
quelle
Die robusteste " Ist es definiert" -Prüfung erfolgt mit typeof
Wenn Sie nur nach einer definierten Variablen suchen, um einen Standard zuzuweisen, können Sie für einen einfach zu lesenden Liner häufig Folgendes tun:
Die Verwendung ist häufig in Ordnung, siehe: Idiomatische Methode zum Festlegen des Standardwerts in Javascript
Es gibt auch diesen einen Liner, der das Schlüsselwort typeof verwendet :
quelle
Sie können den
typeof
Operator verwenden.Zum Beispiel,
Das obige Code-Snippet gibt die Ausgabe wie folgt zurück
quelle
Um zu überprüfen, ob eine Variable deklariert / gesetzt wurde, habe ich diesen schmutzigen Trick gemacht.
Ich habe keine Möglichkeit gefunden, den Code in eine Funktion zu extrahieren, auch nicht mit
eval
.quelle
Diese Antworten (abgesehen von der Fred Gandt-Lösung) sind entweder falsch oder unvollständig.
Angenommen, ich muss
variableName;
einenundefined
Wert tragen , und daher wurde er so deklariertvar variableName;
, dass er bereits initialisiert ist . - Wie überprüfe ich, ob es bereits deklariert ist?Oder noch besser - wie überprüfe ich sofort, ob "Book1.chapter22.paragraph37" mit einem einzigen Aufruf vorhanden ist, ohne jedoch einen Referenzfehler auszulösen?
Dazu verwenden wir den leistungsstärksten JasvaScript-Operator, den In- Operator:
In Zeiten höchster Popularität von AJAX habe ich eine Methode (später genannt) isNS () geschrieben, mit der festgestellt werden kann, ob der Namespace vorhanden ist, einschließlich umfassender Tests für Eigenschaftsnamen wie "Book1.chapter22.paragraph37" und vieles mehr.
Aber da es bereits veröffentlicht wurde und aufgrund seiner großen Bedeutung es verdient, in einem separaten Thread veröffentlicht zu werden, werde ich es nicht hier veröffentlichen, sondern Schlüsselwörter ( Javascript + isNS ) bereitstellen, die Ihnen helfen, den Quellcode zu finden, der mit allen unterstützt wird notwendige Erklärungen.
quelle
in
Operator testet nur die Existenz von Eigenschaften, und nicht alle Variablen sind Eigenschaften -const
undlet
Deklarationen nicht (undconst
nicht einmal Variablen ).const
undlet
wurden mit ECMAScript 2015 standardisiert, das vor mehr als 3 Jahren veröffentlicht wurde und seitdem von den üblichen Verdächtigen gut angenommen wurde und heute ziemlich verbreitet ist, wage ich zu sagen - es gibt mehr als 2 Millionen Vorkommen von "const" auf Github in JS-Dateien .in
Betreiber in der Regel testen , ob eine Variable existiert, weil „const und lassen Sie sind nicht [Eigenschaften]“ - , währendconst
in der Tat gesagt werden kann , eine Einführung konstante Referenz, wie im Gegensatz zu einer variablen Referenz,let
auf der anderen Seite einführt tatsächlich eine variable Referenz - es ist, mit anderen Worten, durch eine Maßnahme, eine Variable und Ihre Antwort ist falsch in was bedeutet , dass Sie , ob eine Variable mit definierten testenlet
existiert Mit demin
Operator können Sie nicht.window
Objekts nicht zugänglich. Ich weiß nicht, wie ich Ihnen dies klarer machen kann.let
Schlüsselwort definiert wurden, nicht behandelt . Das ist alles, worauf ich hingewiesen habe.In der in der Frage skizzierten besonderen Situation
ist identisch mit
Ich bevorzuge letzteres, da es kürzer ist.
Bitte beachten Sie, dass wir
console
nur im globalen Bereich suchen (waswindow
in allen Browsern ein Objekt ist). In dieser besonderen Situation ist es wünschenswert. Wir wollen nichtconsole
anderswo definiert werden.@BrianKelley erklärt in seiner großartigen Antwort technische Details. Ich habe nur fehlende Schlussfolgerungen hinzugefügt und es in etwas leichter zu lesendes verdaut.
quelle
Ich benutze je nach Objekt zwei verschiedene Möglichkeiten.
Manchmal möchte ich eine leere Zeichenfolge nicht als Falsey auswerten, daher verwende ich diesen Fall
Wenn Sie das Gegenteil benötigen, wird in erster Linie! Variable zu !! Variable und in der ungültigen Funktion === zu! = Und die Funktionsnamen ändern sich zu notInvalid.
quelle
Meine Präferenz ist
typeof(elem) != 'undefined' && elem != null
.Wie auch immer Sie sich entscheiden, ziehen Sie in Betracht, den Scheck in eine solche Funktion einzufügen
Wenn Sie nicht wissen, dass die Variable deklariert ist, fahren Sie mit fort
typeof (x) != 'undefined' && x != null;
Wenn Sie wissen, dass die Variable deklariert ist, aber möglicherweise nicht vorhanden ist, können Sie sie verwenden
Die Variable, die Sie überprüfen, kann manchmal eine verschachtelte Eigenschaft sein. Sie können prop || verwenden {}, um die Existenz der betreffenden Eigenschaft zu überprüfen:
Verwenden Sie nach jeder Eigenschaft (... '|| {}'). NextProp, damit eine fehlende Eigenschaft keinen Fehler auslöst.
Oder Sie könnten existy wie verwenden
existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)
quelle
typeof (x) != 'undefined' && x != null
entspricht demx != null
Zeitpunkt derx
Deklaration.Es hängt von der Situation ab. Wenn Sie nach etwas suchen, das möglicherweise global außerhalb Ihres Codes definiert wurde oder nicht (z. B. jQuery), möchten Sie Folgendes:
(Da keine strikte Gleichheit erforderlich ist, gibt typeof immer eine Zeichenfolge zurück.) Wenn Sie jedoch Argumente für eine Funktion haben, die möglicherweise übergeben wurde oder nicht, werden diese immer definiert, aber null, wenn sie weggelassen werden.
quelle
Try-Catch
Wenn die Variable überhaupt nicht definiert wurde, können Sie dies ohne Ausführung des Unterbrechungscodes mit dem try-catch-Block wie folgt überprüfen (Sie müssen nicht
use strict
modifizieren).Code-Snippet anzeigen
BONUS: (unter Bezugnahme auf andere Antworten) Warum
===
ist klarer als==
( Quelle )if (a == b)
if (a === b)
quelle
Ich bin überrascht, dass dies noch nicht erwähnt wurde ...
Hier sind einige zusätzliche Variationen mit
this['var_name']
Der Vorteil dieser Methode besteht darin, dass sie verwendet werden kann, bevor eine Variable definiert wird.
quelle
window.bar=undefined
wird definiert und auf einen Wert gesetzt. Ihre Antwort erkennt den Unterschied zwischen dieser und der nicht vorhandenen Variablen nicht. Wenn Sie das getanthis.hasOwnProperty('bar')
haben, könnte es funktioniert haben.Sie könnten einen try ... catch-Block wie folgt verwenden:
Code-Snippet anzeigen
Ein Nachteil ist, dass Sie es nicht in eine Funktion einfügen können, da es einen ReferenceError auslösen würde
quelle