So überprüfen Sie eine nicht definierte Variable in JavaScript


913

Ich wollte überprüfen, ob die Variable definiert ist oder nicht. Im Folgenden wird beispielsweise ein nicht definierter Fehler ausgegeben

alert( x );

Wie kann ich diesen Fehler abfangen?



5
Sieht so aus, als wäre dies ein Großvater: stackoverflow.com/questions/1485840/… stackoverflow.com/questions/2647867/… - großartige Gramps vielleicht: stackoverflow.com/questions/27509/…
zufällig

1
Dies ist kein Duplikat des markierten Duplikats. Variable Auflösung und Auflösung von Objekteigenschaften sind sehr unterschiedliche Dinge. Ein besseres Duplikat ist, wie man überprüft, ob eine Variable in Javascript vorhanden ist. .
RobG

Ihr Fehler ist darauf zurückzuführen, dass die Variable nicht deklariert wurde. Die meisten Antworten konzentrieren sich auf die Zuordnung. Siehe meine Antwort für mehr. Außerdem geben viele von ihnen fälschlicherweise an, dass null und undefiniert Objekte in JavaScript sind. Sie sind Primitive , keine Objekte ...
JBallin

Antworten:


1690

In JavaScript nullist ein Objekt. Es gibt einen anderen Wert für Dinge, die es nicht gibt undefined. Das DOM gibt nullin fast allen Fällen zurück, in denen es keine Struktur im Dokument findet, aber in JavaScript selbst undefinedwird der Wert verwendet.

Zweitens, nein, es gibt kein direktes Äquivalent. Wenn Sie wirklich speziell nach suchen möchten, gehen Sie wie folgt vor null:

if (yourvar === null) // Does not execute if yourvar is `undefined`

Wenn Sie überprüfen möchten, ob eine Variable vorhanden ist, können Sie dies nur mit try/ tun catch, da typeofeine nicht deklarierte Variable und eine mit dem Wert deklarierte Variable undefinedals äquivalent behandelt werden.

Um zu überprüfen, ob eine Variable deklariert ist und nicht undefined:

if (yourvar !== undefined) // Any scope

Bisher musste der typeofOperator verwendet werden, um sicher nach undefiniert zu suchen, da eine Neuzuweisung undefinedwie bei einer Variablen möglich war. Der alte Weg sah so aus:

if (typeof yourvar !== 'undefined') // Any scope

Das Problem der undefinedNeuzuweisung wurde in ECMAScript 5 behoben, das 2009 veröffentlicht wurde. Sie können es jetzt sicher verwenden ===und !==testen, undefinedohne es zu verwenden, typeofda undefinedes seit einiger Zeit schreibgeschützt ist.

Wenn Sie wissen möchten, ob ein Mitglied unabhängig existiert, sich aber nicht darum kümmern, welchen Wert es hat:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

Wenn Sie wissen möchten, ob eine Variable wahr ist :

if (yourvar)

Quelle


71
undefiniert ist kein reserviertes Wort; Sie (oder der Code eines anderen) können "undefined = 3" ausführen, wodurch zwei Ihrer Tests unterbrochen werden.
Jason S

6
"Wenn Sie wissen, dass die Variable existiert, aber nicht wissen, ob ein Wert darin gespeichert ist" - huh?!
Jason S

36
Ich denke, er bezieht sich auf eine deklarierte Variable, der nicht zugewiesen wurde. zB: var foo; // foo existiert, hat aber keinen Wert
Wally Lawless

3
Hmmm ... Ich habe gerade den "Quell" -Link bemerkt: Dieser gesamte Beitrag ist ein direktes Zitat aus einer Mailingliste und sollte wahrscheinlich bearbeitet werden, um dies klarer zu machen, da der ursprüngliche Autor nicht zur Klärung zur Verfügung steht.
Jason S

11
"In JavaScript ist null ein Objekt.", Das ist eigentlich nicht wahr, und wahrscheinlich ist der typeofOperator ( typeof null == 'object') der Schuldige dieses Missverständnisses . Der nullWert ist ein primitiver Wert , der der einzige Wert vom Typ Null ist .
CMS

347

Der einzige Weg, um wirklich zu testen, ob eine Variable besteht, undefinedbesteht darin, Folgendes zu tun. Denken Sie daran, undefiniert ist ein Objekt in JavaScript.

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

Einige der anderen Lösungen in diesem Thread lassen Sie glauben, dass eine Variable undefiniert ist, obwohl sie definiert wurde (z. B. mit dem Wert NULL oder 0).


18
Da die Frage war, ist hier NICHT UNDEFINIERT, sollte der Typ von someVar! == 'undefined' sein, oder?
Eomeroff

1
Wirklich, ich glaube nicht, dass undefinded ein Objekt ist. Überprüfen Sie zuerst die
Nicramus

2
Der einzige Test, der kein a erzeugt ReferenceError.
Nostalg.io

2
Dieser Code ist korrekt, aber ich denke, undefinedein Objekt in Javascript ist eine Fehlinformation. Bezieht sich diese Aussage trotzdem auf Ihre Antwort? Dies ist ein Wert undefinedvom Typ undefined, der dem genannten globalen Bezeichner zugewiesen ist undefined.
SimplGy

1
Dies ist jetzt falsch, da dies der einzige Weg ist. undefinedwurde nur seit ES5 gelesen. Sie können if (x === undefined) {...}mit der folgenden Kurzform sicher auf undefiniert testen : if (x === void 0).
Stephen M Irving

66

Technisch gesehen ist die richtige Lösung (glaube ich):

typeof x === "undefined"

Sie können manchmal faul werden und verwenden

x == null

Dadurch können jedoch sowohl eine undefinierte Variable x als auch eine Variable x, die null enthält, true zurückgeben.


1
Wenn Sie tippen var x;und dann werden typeof x;Sie "undefined"genau so, wie Sie es getan habentypeof lakjdflkdsjflsj;
Muhammad Umer

Es gibt also keine Möglichkeit, nach undefinierten, aber deklarierten Variablen zu suchen.
Muhammad Umer

1
Ich denke nicht; Ich bin mir nicht sicher, warum du das willst.
Jason S

ujndefined sollte nicht zwischen Spitzen liegen
LowFieldTheory

Was meinst du mit Apices?
Jason S

19

Eine noch einfachere und kürzere Version wäre:

if (!x) {
   //Undefined
}

ODER

if (typeof x !== "undefined") {
    //Do something since x is defined.
}

26
Das erste Code-Stück kann falsch sein, wenn x über einen Funktionsaufruf gesetzt wird. wie x = A (); Wenn A nichts zurückgibt, gibt es standardmäßig "undefined" zurück. Ein! X zu machen wäre wahr, was logisch korrekt wäre. Wenn A () jedoch 0 zurückgibt, sollte! X als x = 0 falsch sein. In JS ist jedoch auch! 0 wahr.
Rajat

Der zweite Code kann gekürzt werden zu: if (! typeof (XX)) {...} else {...}
Alejandro Silva

2
@AlejandroSilva Entschuldigung für die späte Antwort. Dies funktioniert nicht, da typeof eine Zeichenfolge zurückgibt. Daher wird für eine undefinierte Variable 'undefined' zurückgegeben, was wiederum als TRUE ausgewertet wird, was zu einem falsch positiven Ergebnis einer definierten var führt.
Dmitri Farkov

5
Bitte entfernen Sie den ersten Ausschnitt, es ist nur schlecht
Juan Mendes

1
Andere Kommentare haben darauf hingewiesen, dass das erste Beispiel schlecht ist, aber nicht klar warum. Also, für alle neuen Codierer :! X testet nicht, ob x definiert ist, sondern ob es wahr ist. Strings, boolean true und positive Zahlen sind alle wahr (und ich vergesse möglicherweise einige Dinge), aber andere potenziell gültige Werte wie 0, boolean false und eine leere Zeichenfolge sind nicht wahr. Das erste Beispiel kann für bestimmte Anwendungsfälle verwendet werden (z. B. Testen auf eine Zeichenfolge, wenn Sie leer wie undefiniert behandeln können). Aufgrund der vielen Fälle, in denen dies nicht der Fall ist, sollte dies jedoch nicht als Standardmethode für die Überprüfung angesehen werden.
CFC

16

Ich habe oft getan:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}

9
Ändern Sie "==" in "===". Wenn Sie doSomething (null) aufrufen, erhalten Sie auch die Warnung. Es sei denn, Sie wollen das.
Jason S

Ja. Sie müssen sich entscheiden, ob Sie gleichwertig oder genau gleichwertig sein möchten. Jeder Fall könnte eine Verwendung haben.
Joe

1
einfach wie folgt prüfen-> if (typeof variableName! == 'undefined') {alert (variableName);}
Muhammad Sadiq

Dies ist nutzlos, da Sie ohnehin keine undefinierte Variable an eine Funktion übergeben können
avalanche1

2
Sicher kannst du. Versuchen Sie, eine Funktion ohne Argument aufzurufen.
Joe

3

Sie können auch den ternären Bedingungsoperator verwenden:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);


Was wäre wenn var a = false;? Sie sollten das überprüfen, wenn a===undefinedstattdessen
Iter Ator

1
Frage: Überprüfen Sie eine nicht definierte Variable ..... Dies ist eine undefinierte Variable: var x; Wenn Sie oben tun, wird ein Fehler
ausgegeben

"Wenn a = false, wird angezeigt, dass ich 'a' nicht kenne" - Das ist das Problem. Die Frage ist, ob es definiert ist und nicht, ob es wahr ist. Wenn a als falsch definiert ist, ist a nicht undefiniert. Dies gibt in diesem Fall das falsche Ergebnis zurück. Weitere Informationen dazu, warum dieser Ansatz nicht funktioniert, finden Sie in meinem Kommentar unter stackoverflow.com/a/858270/2055492 .
CFC

testet nicht nur !awahr für undefined, sondern auch wahr für 0und nullund false. Dies ist sehr falsch und sollte entfernt werden.
Stephen M Irving

2

Ich benutze oft den einfachsten Weg:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

BEARBEITEN:

Ohne Initialisierung der Variablen wird die Ausnahme "Uncaught ReferenceError: Variable ist nicht definiert ..." ausgelöst.


2
Uncaught ReferenceError: variable is not defined
Muhammad Umer

@ MuhammadUmer, falsch! variableist definiert durch var variable;. Und dieses Snippet wird variableim lokalen Bereich überschrieben . Es kann die Logik unterbrechen, die den Zugriff auf einen Abschluss oder eine globale Variable erwartet. Dh:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
Евгений Савичев

2

Eine andere mögliche "Lösung" besteht darin, das windowObjekt zu verwenden. Es vermeidet das Referenzfehlerproblem in einem Browser.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}

Dies löst die ursprüngliche Frage überhaupt nicht und ist völlig irrelevant. Poster fragte nicht, wie man testet, ob etwas wahr oder falsch ist, sondern wie man es testet undefined. Das wird das nicht tun.
Stephen M Irving

2

Der Fehler sagt Ihnen, dass xes nicht einmal existiert! Es wurde nicht deklariert , was sich von der Zuweisung eines Werts unterscheidet.

var x; // declaration
x = 2; // assignment

Wenn Sie deklarieren x, erhalten Sie keinen Fehler. Sie erhalten eine Warnung, die besagt, undefineddass xvorhanden / deklariert wurde, aber kein Wert zugewiesen wurde.

Um zu überprüfen, ob die Variable deklariert wurde, können Sie mit typeofjeder anderen Methode überprüfen, ob eine Variable vorhanden ist, denselben Fehler auslösen, den Sie ursprünglich erhalten haben.

if(typeof x  !==  "undefined") {
    alert(x);
}

Hiermit wird der Typ des in gespeicherten Werts überprüft x. Es wird nur zurückkehren , undefinedwenn xnicht erklärt worden ist oder wenn es wurde erklärt worden und wurde noch nicht zugeordnet.


undefined wurde seit ES5 (Version 2009) schreibgeschützt und Sie benötigen den typeofOperator nicht mehr .
Stephen M Irving

2

Der voidOperator gibt undefinedfür jedes an ihn übergebene Argument / Ausdruck zurück. Sie können also anhand des Ergebnisses testen (tatsächlich ändern einige Minifizierer Ihren Code von undefinedin void 0, um ein paar Zeichen zu speichern).

Zum Beispiel:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}

Ding ding! Dies ist die richtige Antwort. Schade, dass es ganz unten ist. Jeder ist so darauf aus, immer noch zu benutzen, typeofund das Denken undefinedkann neu zugewiesen werden, was seit etwa einem Jahrzehnt nicht mehr möglich war.
Stephen M Irving

Dies war auch vor ES5 sicher, denn damals, selbst wenn Sie neu zugewiesen hatten undefined, denn Gott weiß nur, aus welchem ​​Grund, wird die Verwendung void 0immer zurückkehren, undefinedunabhängig davon.
Stephen M Irving

1

Wir können undefinedFolgendes überprüfen

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}

1

Mach einfach so etwas wie unten:

function isNotDefined(value) {
  return typeof value === "undefined";
}

und nenne es wie:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false

0

Die akzeptierte Antwort ist richtig. Ich wollte nur noch eine Option hinzufügen. Sie können try ... catchBlock auch verwenden , um diese Situation zu behandeln. Ein verrücktes Beispiel:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

Beachten Sie den catchBlock, der etwas chaotisch ist, da er einen Bereich auf Blockebene erstellt. Und natürlich ist das Beispiel extrem vereinfacht, um die gestellte Frage zu beantworten. Es behandelt keine Best Practices bei der Fehlerbehandlung;).


0

Ich verwende eine kleine Funktion, um zu überprüfen, ob eine Variable deklariert wurde, wodurch die Unordnung in meinen Javascript-Dateien erheblich verringert wird. Ich füge eine Prüfung für den Wert hinzu, um sicherzustellen, dass die Variable nicht nur existiert, sondern auch einen Wert erhalten hat. Die zweite Bedingung prüft, ob die Variable ebenfalls instanziiert wurde. Wenn die Variable definiert, aber nicht instanziiert wurde (siehe Beispiel unten), wird immer noch ein Fehler ausgegeben, wenn Sie versuchen, auf ihren Wert in Ihrem Code zu verweisen.

Nicht instanziiert - Instanziiert var my_variable;-var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

Sie können dann eine bedingte Anweisung verwenden, um zu testen, ob die Variable wie folgt definiert UND instanziiert wurde ...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

oder um zu testen, ob es nicht definiert und instanziiert wurde ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }

1
Warum geben Sie Ihr Prädikat nicht sofort zurück? return typeof el !== "undefined" && typeof el.val() !== "undefined"
Skubski
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.