JavaScript-Prüfung, ob eine Variable vorhanden ist (definiert / initialisiert)

1767

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) {
Samuel Liew
quelle
5
Wenn Sie wissen möchten, ob foodeklariert ist, entweder typeof foo === 'undefined'odertypeof foo === typeof undefined
1
Die hoch bewerteten Antworten funktionieren nicht für Variablen, die deklariert sind, aber den Wert haben undefined. Die richtige Antwort ist diese: stackoverflow.com/a/36432729/772035
Paul
@Paulpro, die verwendete Version hasOwnProperty('bar')hat nicht die gleichen Mängel wie die anderen, würde aber einige Anpassungen für Node erfordern (ersetzen windowdurch global).
Oligofren
@ Paulpro In der Tat, aber als ich darüber nachdachte, bevor Sie antworteten, kam ich zu dem Schluss, dass es nicht wirklich ein praktisches Problem ist. Wenn Sie sich mit Variablen mit Block- oder Funktionsbereich befassen, handelt es sich normalerweise um Code, den Sie besitzen oder auf den Sie Schreibzugriff haben, sodass in jedem Fall ein Laufzeitfehler auftritt, der behoben werden kann. Während das übliche Problem mit Variablen, die nicht definiert wurden (nicht existieren), normalerweise in Code liegt, der außerhalb Ihrer Kontrolle liegt, benötigen Sie eine Möglichkeit, ihn zu erkennen. Es ist also die 80/20-Lösung.
Oligofren

Antworten:

3055

Sie möchten den typeofOperator . Speziell:

if (typeof variable !== 'undefined') {
    // the variable is defined
}
Jim Puls
quelle
35
Das sieht nach einer guten Lösung aus, aber können Sie erklären, warum dies funktioniert?
Morgan Cheng
46
Eigentlich sollten Sie überprüfen, ob das Objekt das ist, was Sie brauchen. Das wäre also, wenn (typeof console == 'object') {// Variable das ist, was ich brauche}
staticsan
59
@ George IV: "mach einfach` if (Variable) "- ähm, nein, das schlägt fehl für false und 0.
Jason S
17
'if (variable)' schlägt auch fehl, um das Vorhandensein von Objekteigenschaften zu testen.
Scotts
54
@ geowa4 Eigentlich wird das einen Fehler auslösen, wenn die Variable undefiniert ist.
Kevinji
857

Der typeofOperator prüft, ob die Variable wirklich undefiniert ist.

if (typeof variable === 'undefined') {
    // variable is undefined
}

Der typeofOperator 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 nullzurückkehren wird "object". Wir müssen vorsichtig sein, um den Fehler zu vermeiden, eine Variable mit zu initialisieren null. Um sicher zu gehen, könnten wir stattdessen Folgendes verwenden:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

Weitere Informationen zur Verwendung eines strengen Vergleichs ===anstelle einer einfachen Gleichheit ==finden Sie unter:
Welcher Gleichheitsoperator (== vs ===) sollte in JavaScript-Vergleichen verwendet werden?

Samuel Liew
quelle
2
if (! variable_here) {// dein Code hier. };
Ich
5
if(! variable_here)wird in vielen Fällen brechen. Wenn die Variable 0 oder falsch ist, schlägt sie fehl. Das willst du nicht.
Cory Danielson
2
Ich kann mich nicht entscheiden, ob ich darüber abstimmen soll. Genau genommen 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.
Alnitak
1
@StevenPenny Überprüfen Sie die Zeitleiste. Die Top-Antwort wurde aus einer anderen Frage zusammengeführt, nachdem diese Antwort veröffentlicht wurde
Rob
1
Diese Antwort funktioniert nicht. Dies ist die einzige Antwort hier, die funktioniert: stackoverflow.com/a/36432729/772035
Paul
222

In vielen Fällen wird Folgendes verwendet:

if (elem) { // or !elem

erledigt den Job für Sie! ... dies überprüft die folgenden Fälle:

  1. undefined : wenn der Wert nicht definiert ist und es istundefined
  2. null : wenn es null ist, zum Beispiel wenn ein DOM-Element nicht existiert ...
  3. leere Zeichenfolge :''
  4. 0 : Nummer Null
  5. NaN : keine Nummer
  6. falsch

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.

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

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:

undefiniert, null usw.

Alireza
quelle
2
@ Alireza, schön! Ihre Antwort wird vielen Menschen da draußen helfen. Ich habe diese falschen Werte bereits auswendig gelernt, das einzige, bei dem ich mir nicht sicher war, war [].
Thiago Yoithi
13
Ich bekomme einen "ReferenceError: elem ist nicht definiert"
ropo
3
@ropo, weil du das Element nicht einmal definiert hast, um zu überprüfen, was es ist. Wenn es dein Fall ist, musst du es mit typeof (elem) === "string" überprüfen, das bereits erwähnt wird ...
Alireza
19
Dann ist die Antwort irreführend, wenn sie sagt if(elem), dass sie auf undefiniert prüft (während sie einen nicht definierten Fehler zurückgibt), nicht wahr?
Fanky
1
Geben Sie mir einen Anwendungsfall, um zu überprüfen, ob eine Variable undefiniert ist und ob sie mit einem undefinierten Wert definiert ist. Einige von Ihnen greifen nach Strohhalmen und versuchen, brillant auszusehen, aber wenn Sie einen Wert als undefiniert festlegen und nach diesem Wert suchen, wird er offensichtlich falsch zurückgegeben oder Sie müssen Ihren Code ändern, smh ... diese Antwort ist richtig !! !!!
Almcaffee
210

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:

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

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):

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

Dies setzt natürlich voraus, dass Sie in einem Browser ausgeführt werden (wobei windowein 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 windowstilistisch konsistent mit der Verwendung, window.nameum sich auf Globale zu beziehen. Durch den Zugriff auf Globals als Eigenschaften windowund 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.

Brian Kelley
quelle
7
Dies prüft nur, ob die Variable global deklariert wurde. Wenn Sie richtig codieren, beschränken Sie Ihre globalen Variablen. Für lokale Variablen wird false gemeldet: (function () {var sdfsfs = 10; console.log ("sdfsfs" im Fenster);}) () `
Eddie Monge Jr
2
Dies ist die beste Antwort. Ich war mit diesem Versuch am Ende, herauszufinden, wie genau dieser Eckfall zu erklären ist. Brillant. Hatte keine Ahnung, dass du das tun könntest.
temporärer_Benutzername
1
Heads-up: Ihre Antwort wurde hier von stackoverflow.com/questions/519145/…
Shog9
Für Angular-Benutzer: Leider scheint dies in einer ng-if-Anweisung nicht zulässig zu sein.
qwertzguy
... perfekte Blaupause für Kontrollen entlang des Umfangs. Haben Sie eine Leistungsangabe, wenn "im Fenster" oder "(Typ der Variablen === 'undefiniert' || Variable === null)". Eigentlich interessiere ich mich für einen harten Faktentest und nicht für mögliche Argumente (was ich selbst tun könnte: Zweite Klausel hat mehr Operationen -> schlechtere Leistung)
Schneller
119

In den meisten Fällen würden Sie Folgendes verwenden:

elem != null

Im Gegensatz zu einem einfachen if (elem), ermöglicht es 0, false, NaNund '', aber Spuck nulloder undefinedihm 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 , wenn elemein Objekt sein, oder wenn garantiert false, 0usw. „default“ Werte (daher gleichwertig betrachtet undefinedoder null).

  • typeof elem == 'undefined'kann in Fällen verwendet werden, in denen eine Angabe nulleine eindeutige Bedeutung für eine nicht initialisierte Variable oder Eigenschaft hat.

    • Dies ist die einzige Prüfung, die keinen Fehler auslöst, wenn sie elemnicht deklariert ist (dh keine varAnweisung, keine Eigenschaft von windowoder 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:

if (elem === undefined) ...

Da die globale undefinedVariable jedoch mit einem anderen Wert überschrieben werden kann, ist es am besten, die Variable undefinedim aktuellen Bereich zu deklarieren, bevor Sie sie verwenden:

var undefined; // really undefined
if (elem === undefined) ...

Oder:

(function (undefined) {
    if (elem === undefined) ...
})();

Ein sekundärer Vorteil dieser Methode besteht darin, dass JS-Minifizierer die undefinedVariable auf ein einzelnes Zeichen reduzieren können , wodurch Sie jedes Mal einige Bytes sparen.

David Tang
quelle
17
Ich bin schockiert, dass Sie überschreiben können undefined. Ich denke nicht einmal, dass das in der Antwort erwähnenswert ist. Wahrscheinlich der schlechteste akzeptable Variablenname in ganz Javascript.
Cory Danielson
2
Dies führt zu einer Ausnahme und erfordert die Verwendung window.vor der Variablen, wenn diese im globalen Kontext verwendet wird. Dies ist nicht der beste Weg.
Alex W
4
Aufgrund dieses übergeordneten Problems sollten Sie IMMER void(0)anstelle von verwenden undefined.
Bartłomiej Zalewski
+1 , da diese Antwort weist darauf hin , dass manchmal können Sie eigentlich wollen identifizieren false, 0usw. als ungültige Werte.
Rinogo
77

Überprüfen Sie, ob window. hasOwnProperty( " varname" )

Eine Alternative zur Fülle von typeofAntworten;

Globale Variablen, die mit einer var varname = value;Anweisung im globalen Bereich deklariert wurden

kann als Eigenschaften des Fensterobjekts zugegriffen werden.

Als solche die hasOwnProperty()Methode, die

Gibt einen Booleschen Wert zurück, der angibt, ob das Objekt die angegebene Eigenschaft als eigene Eigenschaft hat (im Gegensatz zum Erben).

kann verwendet werden, um festzustellen, ob

a varvon "varname" wurde global deklariert, dh es ist eine Eigenschaft von window.

// Globally established, therefore, properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
//  window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ), // true
    window.hasOwnProperty( "bar" ), // true
    window.hasOwnProperty( "baz" ), // true
    window.hasOwnProperty( "qux" )  // false
] );

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 varDefinition einer Variablen , im Gegensatz zu let:

deklariert eine lokale Variable für den Blockbereich und initialisiert sie optional mit einem Wert.

unterscheidet sich vom varSchlüsselwort, das eine Variable global oder lokal für eine gesamte Funktion unabhängig vom Blockbereich definiert.

Auf der obersten Ebene von Programmen und Funktionen wird letim Gegensatz dazu varkeine Eigenschaft für das globale Objekt erstellt.

Der Vollständigkeit const halber : Konstanten sind per Definition nicht wirklich variabel (obwohl ihr Inhalt sein kann); relevanter:

Globale Konstanten werden im Gegensatz zu varVariablen nicht zu Eigenschaften des Fensterobjekts . Ein Initialisierer für eine Konstante ist erforderlich. Das heißt, Sie müssen den Wert in derselben Anweisung angeben, in der er deklariert ist.

Der Wert einer Konstante kann sich durch Neuzuweisung nicht ändern und kann nicht neu deklariert werden.

Die const-Deklaration erstellt einen schreibgeschützten Verweis auf einen Wert. Dies bedeutet nicht, dass der darin enthaltene Wert unveränderlich ist, sondern dass die Variablenkennung nicht neu zugewiesen werden kann.

Da letVariablen oder constKonstanten niemals Eigenschaften eines Objekts sind, das die hasOwnProperty()Methode geerbt hat , kann sie nicht zur Überprüfung ihrer Existenz verwendet werden.

In Bezug auf die Verfügbarkeit und Verwendung von hasOwnProperty():

Jedes von Object abstammende Objekt erbt die hasOwnProperty()Methode. [...] Im Gegensatz zum inOperator überprüft diese Methode nicht die Prototypenkette des Objekts.

Fred Gandt
quelle
1
Dies ist eine großartige Alternative und sollte bei dieser Frage ganz oben stehen. Bitte vereinfachen Sie die Antwortüberschrift mit einem Arbeitsbeispiel, das zurückgibt true(z . B. window.hasOwnProperty('console')oder var hop = "p";window.hasOwnProperty('hop')).
CPHPython
2
Endlich etwas, das keinen Fehler auslöst, weil auf ein Mitglied zugegriffen wird, das nicht existiert ... Etwas, das alle typeofAntworten einfach übersehen.
Zelphir Kaltstahl
1
Diese Antwort ist veraltet. Gemäß Standard-ECMAScript können Sie Variablen definieren, bei letdenen diese Variablen nicht als Eigenschaften des window[oder eines anderen verfügbaren] Objekts verfügbar sind. hasOwnPropertyTests auf das Vorhandensein von Eigenschaften , nicht von Variablen, und können daher nicht zum Erkennen von durch definierten Variablen verwendet werden let.
Amn
1
@amn Die Antwort bleibt in Bezug auf die Verwendung von varund ist in dieser Hinsicht nicht veraltet. Ich habe jedoch einen Hinweis hinzugefügt, in dem dargelegt wird, wie sich die Verwendung von unterscheidet letund constvon der von unterscheidet var. Vielen Dank für Ihre Inspiration. zusammen erheben wir uns :)
Fred Gandt
1
@amn Ich habe die Antwort (hoffentlich zum letzten Mal) umgeschrieben, um klarer zu machen, dass hasOwnPropertysie nur auf die vorgeschriebene Weise verwendet werden kann, um das Vorhandensein von varVariablen zu überprüfen . Es liest sich okay für mich.
Fred Gandt
68

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:

var setOrNot = typeof variable !== typeof undefined;

Es wird am häufigsten in Kombination mit einem ternären Operator verwendet , um einen Standard festzulegen, falls eine bestimmte Variable nicht initialisiert wurde:

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

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:

function isset(variable) {
    return typeof variable !== typeof undefined;
}

Dies führt jedoch zu einem Referenzfehler, wenn Sie z. isset(foo)und Variable foowurde nicht definiert, da Sie eine nicht vorhandene Variable nicht an eine Funktion weitergeben können:

Nicht gefangener Referenzfehler: foo ist nicht definiert


Testen, ob Funktionsparameter undefiniert sind

Während unsere issetFunktion 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:

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

Obwohl kein Wert für yan function weitergegeben wird, funktioniert testunsere issetFunktion in diesem Zusammenhang einwandfrei, da ysie in function testals undefinedWert bekannt ist.

John Slegers
quelle
41

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.

var values = typeof variable !== 'undefined' ? variable : '';

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 undefinedoder sein null. 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 undefinedund nullüberprüft.

var values = variable ? variable : '';
RajeshKdev
quelle
Die Antwort ist völlig falsch. typeof variable gibt immer einen String zurück und ist daher niemals false. zB wenn typeof(booooo)ist "undefined"dann typeof(typeof boooooo)ist "string"und typeof boooooo && trueist immer true. @ John-Slegers 'Antwort ist so kurz wie möglich mit typeof.
mpag
Es ist absolut richtige Antwort . Hier ist eine funktionierende Geige . Und ich weiß nicht, über welches Szenario Sie sprechen. Bei den Fragen geht es darum, die Existenz von Variablen zu überprüfen.
RajeshKdev
@mpag Sag nicht Flat falsch. Beweise es . Einen Fehler zu finden ist ganz einfach, stattdessen können Sie hier gute Antworten geben !!!. Wenn die Antwort völlig falsch ist, hätten 28 Programmierer nicht abgestimmt, ohne meine Antwort zu überprüfen. Da es hier viele renommierte Antworten gibt, hätten sie das abstimmen können, nicht dies.
RajeshKdev
Eigentlich ist der zweite Teil des Codes nicht wie oben zu prüfen. Ich dachte, die Leute würden unter dieser Zeile verstehen 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.
RajeshKdev
1
Ihre 2. Prüfung wird mit 0 Wert fehlschlagen
Fareed Alnamrouti
32

Kurzer Weg zum Testen einer Variablen ist nicht deklariert (nicht undefiniert)

if (typeof variable === "undefined") {
  ...
}

Ich fand es nützlich, um ein Skript zu erkennen, das außerhalb eines Browsers ausgeführt wird (ohne deklarierte windowVariable).

user2878850
quelle
Ist dies der "kanonische Weg", der tragbar ist?
Jason
3
Das ist falsch. window.bar=undefinedwird definiert und auf einen Wert gesetzt. Ihre Antwort erkennt den Unterschied zwischen dieser und der nicht vorhandenen Variablen nicht. Wenn Sie das getan this.hasOwnProperty('bar')haben, könnte es funktioniert haben.
Oligofren
Dieser Code funktioniert nicht und Sie können dies mithilfe einer beliebigen Browserkonsole überprüfen
ha9u63ar
1
Überlegen Sie const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();. Variable xist definiert, aber false wird zurückgegeben ...
user2878850
29

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.

=== nulloder !== nullprüft nur, ob der Wert der Variablen genau ist null.

== nulloder != nullprüft, ob der Wert undefinedoder ist null.

if(value)prüft , ob die Variable undefined, null, 0, oder eine leere Zeichenfolge.

Alan Geleynse
quelle
12

Die höchste Antwort ist richtig, verwenden Sie typeof.

Ich wollte jedoch darauf hinweisen, dass JavaScript undefinedveränderlich ist (aus irgendeinem gottlosen Grund). Wenn Sie also einfach nach prüfen varName !== 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 verwenden typeof, 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, typeofda er das Überschreiben undefinedvon 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 ...

Schattensturm
quelle
1
Der Punkt ist strittig, denn wenn varName undefiniert ist, varName !== undefinedwird nur ein ReferenceError verursacht. Die Veränderlichkeit von spielt undefinedkeine Rolle.
Wutaz
Heads-up: Ihre Antwort wurde hier von stackoverflow.com/questions/519145/…
Shog9
1
In neueren Javascript-Versionen undefinedist dies eine schreibgeschützte Eigenschaft. Um jedoch kugelsicher zu sein, können Sie verwenden typeof mvVar === typeof void 0. void 0kehrt undefinedimmer zurück.
Kwarnke
11
if (typeof console != "undefined") {    
   ...
}

Oder besser

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

Funktioniert in allen Browsern

Boslior
quelle
3
Warum ist letzteres Ihrer Meinung nach besser?
Skalee
3
@skalee Ich stimme zu, letzteres ist besser. Dies aus dem einfachen Grund, dass Sie prüfen, ob die Typen die gewünschten sind, bevor Sie sie verwenden.
Broxzier
Heads-up: Ihre Antwort wurde hier von stackoverflow.com/questions/519145/…
Shog9
9

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:

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

..kann reduziert werden auf:

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 

de3
quelle
Dies hat das OP nicht verlangt. Wenn data.url gleich ''Ihrer Lösung ist, wird es als undefiniert betrachtet, wenn es tatsächlich so definiert ist, dass es eine leere Zeichenfolge enthält.
Demonblack
Ich bin damit einverstanden, dass nicht gefragt wurde, und Sie haben Recht: Die leere Zeichenfolge '' wird als undefiniert betrachtet. Aber ich habe dies gepostet, weil ich dachte, es könnte nützlich sein für die Debatte, die zwischen verschiedenen Antworten geführt wurde. Und in diesem Beispiel und in vielen anderen Fällen möchten Sie nur eine Zeichenfolge drucken, wenn tatsächlich Inhalt vorhanden ist. Daher ist es in Ordnung, die Tatsache auszunutzen, dass das Javascript sowohl eine leere Zeichenfolge als auch eine undefinierte als falsch betrachtet
de3
8

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.


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);

Jith
quelle
1
Wäre hilfreich, um die Ausgabe jeder Warnung inline anzuzeigen.
Demisx
@demisx Einverstanden, aber anstatt die Bearbeitung vorzuschlagen, warum nicht einfach machen? Die Option gibt es aus einem Grund. Einige mögen es für unhöflich halten; Ich halte es für effizient - also habe ich die Antwort selbst bearbeitet (ausstehende Überprüfung).
Fred Gandt
1
@Fred - Ich habe mir den Bearbeitungsverlauf angesehen und kann mir vorstellen, warum Ihre Änderungen abgelehnt wurden. Anstatt nur Zeilen hinzuzufügen, um zu zeigen, wie die Ausgabe aussehen würde, haben Sie, wie demisx vorgeschlagen hat, das, was Jith gepostet hat, erheblich geändert.
Stephen P
8

Null ist ein Wert in JavaScript und gibt typeof nullzurü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:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}
Razan Paul
quelle
7

Die robusteste " Ist es definiert" -Prüfung erfolgt mit typeof

if (typeof elem === 'undefined')

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:

elem = elem || defaultElem;

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 :

elem = (typeof elem === 'undefined') ? defaultElem : elem;
Zv_oDD
quelle
7

Sie können den typeofOperator verwenden.

Zum Beispiel,

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

Das obige Code-Snippet gibt die Ausgabe wie folgt zurück

Variable dataSet ist: undefiniert.

Ravindra Miyani
quelle
1
Heads-up: Ihre Antwort wurde hier von stackoverflow.com/questions/519145/…
Shog9
7

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.

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}
Ferran Maylinch
quelle
Was meinst du mit "Code in eine Funktion extrahieren"?
Melab
7

Diese Antworten (abgesehen von der Fred Gandt-Lösung) sind entweder falsch oder unvollständig.

Angenommen, ich muss variableName;einen undefinedWert tragen , und daher wurde er so deklariert var 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:

"[variable||property]" in [context||root] 
>> true||false

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.

Bekim Bacaj
quelle
1
Der inOperator testet nur die Existenz von Eigenschaften, und nicht alle Variablen sind Eigenschaften - constund letDeklarationen nicht (und constnicht einmal Variablen ).
Am
1
constund letwurden 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 .
Amn
Ja, "variabel" - genau. Welches ist , warum ich auf Ihre Antwort kommentiert, unter Hinweis darauf , dass Sie nicht können die Verwendung inBetreiber in der Regel testen , ob eine Variable existiert, weil „const und lassen Sie sind nicht [Eigenschaften]“ - , während constin der Tat gesagt werden kann , eine Einführung konstante Referenz, wie im Gegensatz zu einer variablen Referenz, letauf 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 testen letexistiert Mit dem inOperator können Sie nicht.
amn
Die ECMAScript 6-Spezifikation definiert die JavaScript-Sprache, weder Sie noch einen Webbrowser. Deshalb wird es eine Spezifikation genannt - es spezifiziert eindeutig die Sprache. Ihre Antwort ist bestenfalls veraltet, im schlimmsten Fall wird absichtlich weggelassen, was Sie für irrelevant halten, während sie sehr relevant ist. Unter Angabe der verknüpften Spezifikation definieren "let- und const-Deklarationen Variablen". Diese Konstrukte sind als Eigenschaften des windowObjekts nicht zugänglich. Ich weiß nicht, wie ich Ihnen dies klarer machen kann.
Amn
Die Antwort deckt nicht alle Fälle von Variablen ab. Insbesondere werden Variablen, die mit dem letSchlüsselwort definiert wurden, nicht behandelt . Das ist alles, worauf ich hingewiesen habe.
Amn
6

In der in der Frage skizzierten besonderen Situation

typeof window.console === "undefined"

ist identisch mit

window.console === undefined

Ich bevorzuge letzteres, da es kürzer ist.

Bitte beachten Sie, dass wir consolenur im globalen Bereich suchen (was windowin allen Browsern ein Objekt ist). In dieser besonderen Situation ist es wünschenswert. Wir wollen nicht consoleanderswo 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.

Skalee
quelle
Heads-up: Ihre Antwort wurde hier von stackoverflow.com/questions/519145/…
Shog9
2
Falsch. Letzteres löst eine Ausnahme in meiner Konsole aus.
John Ktejik
6

Ich benutze je nach Objekt zwei verschiedene Möglichkeiten.

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

Manchmal möchte ich eine leere Zeichenfolge nicht als Falsey auswerten, daher verwende ich diesen Fall

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

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.

SoEzPz
quelle
5

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

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

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

existy(elem) && doSomething(elem);

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:

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

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)

Curtwphillips
quelle
Wenn Sie es in eine Funktion einfügen, ist es redundant. typeof (x) != 'undefined' && x != nullentspricht dem x != nullZeitpunkt der xDeklaration.
Ry-
3

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:

if (typeof(jQuery) != "undefined")

(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.

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"
jpsimons
quelle
3

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 strictmodifizieren).

BONUS: (unter Bezugnahme auf andere Antworten) Warum ===ist klarer als ==( Quelle )

if (a == b)

Geben Sie hier die Bildbeschreibung ein

if (a === b)

Geben Sie hier die Bildbeschreibung ein

Kamil Kiełczewski
quelle
1
Zu Ihrer Information (a == b), das in das Game of Life-Raster aufgenommen wurde, war nicht allzu aufregend.
Johnsnails
0

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.

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!
Daniel
quelle
Das ist falsch. window.bar=undefinedwird definiert und auf einen Wert gesetzt. Ihre Antwort erkennt den Unterschied zwischen dieser und der nicht vorhandenen Variablen nicht. Wenn Sie das getan this.hasOwnProperty('bar')haben, könnte es funktioniert haben.
Oligofren
0

Sie könnten einen try ... catch-Block wie folgt verwenden:

Ein Nachteil ist, dass Sie es nicht in eine Funktion einfügen können, da es einen ReferenceError auslösen würde

function variableExists(x) {
  var status = true
  try {
	  x
  } catch (ReferenceError) {
	  status = false
  }
  
  return status
}

console.log(variableExists(x))

GalaxyCat105
quelle