Jak sprawdzić niezdefiniowaną zmienną w JavaScript

912

Chciałem sprawdzić, czy zmienna jest zdefiniowana, czy nie. Na przykład następujące zgłasza niezdefiniowany błąd

alert( x );

Jak mogę złapać ten błąd?

Jineesh
źródło
1
To nie jest duplikat zaznaczonego duplikatu. Rozdzielczość zmiennych i rozdzielczość właściwości obiektów to bardzo różne rzeczy. Lepszym duplikatem jest jak sprawdzić, czy zmienna istnieje w javascript? .
RobG
Twój błąd wynika z niezadeklarowania zmiennej. Większość odpowiedzi dotyczy zadań. Zobacz moją odpowiedź, aby uzyskać więcej. Dodatkowo wiele z nich błędnie stwierdza, że ​​null i niezdefiniowane są obiektami w JavaScript. Są prymitywami , a nie obiektami ...
JBallin 10.01.18

Odpowiedzi:

1689

W JavaScript nulljest obiektem. Jest jeszcze jedna wartość rzeczy, które nie istnieją, undefined. DOM zwraca nullprawie wszystkie przypadki, w których nie znajduje struktury w dokumencie, ale sama JavaScript undefinedjest użytą wartością.

Po drugie, nie, nie ma bezpośredniego odpowiednika. Jeśli naprawdę chcesz to sprawdzić null, wykonaj:

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

Jeśli chcesz sprawdzić, czy zmienna istnieje, można to zrobić tylko za pomocą try/ catch, ponieważ typeofpotraktuje ona niezadeklarowaną zmienną i zmienną zadeklarowaną o wartości undefinedrównoważnej.

Ale, aby sprawdzić, czy zmienna jest zadeklarowana i nie jest undefined:

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

Wcześniej konieczne było użycie typeofoperatora do bezpiecznego sprawdzenia niezdefiniowanego, ponieważ możliwe było ponowne przypisanie undefinedjak zmienna. Stary sposób wyglądał następująco:

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

Kwestia możliwości undefinedponownego przypisania została naprawiona w ECMAScript 5, który został wydany w 2009 roku. Teraz możesz bezpiecznie używać ===i !==testować undefinedbez użycia, typeofponieważ undefinedjest on tylko do odczytu.

Jeśli chcesz wiedzieć, czy członek istnieje niezależnie, ale nie obchodzi go jego wartość:

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

Jeśli chcesz wiedzieć, czy zmienna jest prawdziwa :

if (yourvar)

Źródło

Sód
źródło
71
niezdefiniowane nie jest słowem zastrzeżonym; ty (lub kod innej osoby) możesz zrobić „undefined = 3”, co zepsuje dwa testy.
Jason S
6
„Jeśli wiesz, że zmienna istnieje, ale nie wiesz, czy jest w niej zapisana jakaś wartość” - huh ?!
Jason S
36
Myślę, że odnosi się do deklarowanej zmiennej, do której nie została przypisana. np .: var foo; // foo istnieje, ale nie ma wartości
Wally Lawless
3
Hmmm ... Właśnie zauważyłem link „źródłowy”: cały ten post jest bezpośrednim cytatem z listy mailingowej i prawdopodobnie powinien zostać zredagowany, aby było to bardziej jasne, ponieważ oryginalny autor nie jest dostępny do wyjaśnienia.
Jason S
11
„W JavaScripcie null jest obiektem”. Nie jest to prawdą i prawdopodobnie przyczyną tego błędnego przekonania jest typeofoperator ( typeof null == 'object'). nullWartość to wartość prymitywny , który jest jedyną wartością typu Null .
CMS
347

Jedynym sposobem, aby naprawdę sprawdzić, czy zmienna jest, undefinedjest wykonanie następujących czynności. Pamiętaj, niezdefiniowany jest obiekt w JavaScript.

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

Niektóre inne rozwiązania w tym wątku prowadzą do przekonania, że ​​zmienna jest niezdefiniowana, nawet jeśli została zdefiniowana (na przykład o wartości NULL lub 0).

Michael Wales
źródło
18
Ponieważ pytanie NIE JEST ODDEFINIOWANE tutaj powinno być typu someVar! == 'undefined', prawda?
eomeroff,
1
Naprawdę nie sądzę, aby niezdefiniowany obiekt był obiektem, najpierw sprawdź dokumentację developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Nicramus
2
Jedyny test, który nie daje wyniku ReferenceError.
Nostalg.io,
2
Ten kod jest poprawny, ale myślę, że powiedzenie undefinedto obiekt w javascript to dezinformacja. Czy to stwierdzenie odnosi się do twojej odpowiedzi? Jest to wartość undefinedtypu undefinedprzypisana do globalnego identyfikatora o nazwie undefined.
SimplGy
1
Jest to teraz nieprawidłowe, ponieważ jest to jedyny sposób. undefinedzostał odczytany tylko od ES5. Można bezpiecznie testować niezdefiniowany użyciem if (x === undefined) {...}lub przy użyciu skrótów takiego: if (x === void 0).
Stephen M. Irving
66

Technicznie właściwym rozwiązaniem jest (wierzę):

typeof x === "undefined"

Czasami możesz się lenić i używać

x == null

ale pozwala to zarówno niezdefiniowanej zmiennej x, jak i zmiennej x zawierającej null, zwrócić wartość true.

Jason S.
źródło
1
jeśli wpiszesz, var x;a typeof x;otrzymasz "undefined"tak, jakbyś to zrobiłtypeof lakjdflkdsjflsj;
Muhammad Umer
Więc nie ma sposobu, aby sprawdzić niezdefiniowaną, ale zadeklarowaną zmienną?
Muhammad Umer
1
Nie sądzę; Nie jestem pewien, dlaczego chcesz.
Jason S
ujndefined nie powinien znajdować się między apeksami
LowFieldTheory
co rozumiesz przez apices?
Jason S
19

Jeszcze łatwiejszą i bardziej skróconą wersją byłoby:

if (!x) {
   //Undefined
}

LUB

if (typeof x !== "undefined") {
    //Do something since x is defined.
}
Dmitri Farkov
źródło
26
pierwszy fragment kodu może być niepoprawny, jeśli x jest ustawiane z wywołania funkcji. jak x = A (); jeśli A nic nie zwróci, domyślnie zwróci „niezdefiniowany”. Wykonanie! X byłoby prawdą, co byłoby logicznie poprawne. Jednak jeśli A () zwraca 0, to x powinno być fałszem, ponieważ x = 0. Jednak w JS! 0 jest również prawdą.
Rajat
drugi kod można skrócić do: if (! typeof (XX)) {...} else {...}
Alejandro Silva
2
@AlejandroSilva Przepraszamy za późną odpowiedź. To nie zadziała, ponieważ typeof zwraca ciąg znaków, więc zwróci „undefined” dla niezdefiniowanej zmiennej, która z kolei będzie traktowana jako PRAWDA, co prowadzi do fałszywie dodatniego zdefiniowanego var.
Dmitri Farkov,
5
Pozbądź się pierwszego fragmentu, jest po prostu zły
Juan Mendes
1
Inne komentarze wskazują, że pierwszy przykład jest zły, ale nie do końca jasny. Tak więc, dla każdego nowego programisty:! X nie sprawdza, czy x jest zdefiniowane, ale czy jest zgodne z prawdą. Ciągi, logiczna prawda i liczby dodatnie są prawdziwe (i być może zapominam o niektórych rzeczach), ale inne potencjalnie poprawne wartości, takie jak 0, logiczna fałsz i pusty ciąg nie są prawdziwe. Pierwszy przykład może działać w określonych przypadkach użycia (np. Testowanie ciągu, jeśli można traktować puste tak samo, jak niezdefiniowane), ale z powodu wielu przypadków, w których tak nie jest, nie należy traktować go jako domyślnego sposobu sprawdzania.
por.
16

Często robiłem:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}
Joe
źródło
9
Rozważ zmianę „==” na „===”. Jeśli wywołasz doSomething (null), otrzymasz także alert. Chyba że tego właśnie chcesz.
Jason S
Tak. Musisz zdecydować, czy chcesz ekwiwalent czy dokładnie równy. Każdy przypadek może mieć zastosowanie.
Joe
1
po prostu sprawdź jak to-> if (typeof nazwa_zmiennej! == 'undefined') {alert (nazwa_zmiennej);}
Muhammad Sadiq
jest to bezużyteczne, ponieważ i tak nie będziesz w stanie przekazać niezdefiniowanej zmiennej do funkcji
lawina1
2
Oczywiście że możesz. Spróbuj wywołać funkcję bez argumentu.
Joe
3

Możesz także użyć trójskładnikowego operatora warunkowego:

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

Jan
źródło
Co jeśli var a = false;? Powinieneś to sprawdzić, jeśli a===undefinedzamiast tego
Iter Ator
1
Pytanie: sprawdź niezdefiniowaną zmienną ..... Jest to zmienna niezdefiniowana: var x; powyższe spowoduje wygenerowanie błędu
Muhammad Umer
„Jeśli a = false, to pokaże„ nie wiem ”a” „- Problem polega na tym, aby sprawdzić, czy jest zdefiniowane, a nie czy to prawda. Jeśli a jest zdefiniowane jako fałsz, to nie jest niezdefiniowane. W takim przypadku zwraca nieprawidłowy wynik. Zobacz mój komentarz na stackoverflow.com/a/858270/2055492, aby uzyskać więcej informacji na temat tego, dlaczego to podejście nie działa.
por.
nie tylko !aprzetestować TRUE undefined, to również prawdziwe dla testuje 0i nulli false. Jest to bardzo niepoprawne i powinno zostać usunięte.
Stephen M. Irving
2

Często używam najprostszego sposobu:

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

EDYTOWAĆ:

Bez zainicjowania zmiennej zostanie zgłoszony wyjątek „Uncaught ReferenceError: zmienna nie jest zdefiniowana ...”

mokiSRB
źródło
2
Uncaught ReferenceError: variable is not defined
Muhammad Umer
@MuhammadUmer, źle! variablejest zdefiniowany przez var variable;. Ten fragment zastąpi variablezakres lokalny. Może złamać logikę, która oczekuje dostępu do zamknięcia lub zmiennej globalnej. To 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
znaczy
2

Innym potencjalnym „rozwiązaniem” jest użycie windowobiektu. Pozwala to uniknąć problemu z błędem odniesienia w przeglądarce.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}
ubershmekel
źródło
To wcale nie rozwiązuje pierwotnego pytania i jest całkowicie nieistotne. Plakat nie pytał, jak sprawdzić, czy coś jest prawdą czy falseyem, zapytał, jak to sprawdzić undefined. To nie zrobi tego.
Stephen M. Irving
2

Błąd mówi ci, że xnawet nie istnieje! Nie został zadeklarowany , co różni się od przypisania wartości.

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

Jeśli zadeklarujesz x, nie otrzymasz błędu. Zostanie wyświetlony alert z informacją, undefinedponieważ xistnieje / został zadeklarowany, ale nie przypisano mu żadnej wartości.

Aby sprawdzić, czy zmienna została zadeklarowana, możesz użyć typeofdowolnej innej metody sprawdzenia, czy zmienna istnieje, spowoduje zgłoszenie tego samego błędu, który wystąpił na początku.

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

Sprawdza to typ wartości przechowywanej w x. Powróci tylko undefinedgdy xnie została uznana, czy też nie zostały zgłoszone i nie został jeszcze przydzielony.

JBallin
źródło
undefined został odczytany tylko od wersji ES5 (2009) i nie potrzebujesz już typeofoperatora.
Stephen M. Irving
2

Te voidpowroty operatora undefineddla każdej argumentu / ekspresji przekazywane do niego. abyś mógł przetestować wynik (w rzeczywistości niektóre minizery zmieniają kod z undefinednavoid 0 aby zapisać kilka znaków)

Na przykład:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}
svarog
źródło
Ding ding! To jest poprawna odpowiedź. Szkoda, że ​​jest na samym dole. Wszyscy są tak rozłączni, że nadal używają, typeofa myślenie undefinedmożna przypisać ponownie, co nie było możliwe od około dekady.
Stephen M. Irving
Było to również bezpieczne przed ES5, ponieważ wtedy, nawet jeśli zostałeś ponownie przydzielony undefined, bo Bóg tylko wie, z jakiego powodu, używanie void 0zawsze powróci undefinedniezależnie.
Stephen M. Irving
1

Możemy to sprawdzić undefinedw następujący sposób

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}
Arshid KV
źródło
1

Po prostu zrób coś takiego:

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

i nazwij to tak:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false
Alireza
źródło
0

Przyjęta odpowiedź jest poprawna. Chciałem tylko dodać jeszcze jedną opcję. Możesz również użyć try ... catchbloku, aby poradzić sobie z tą sytuacją. Dziwny przykład:

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
}

Uważaj na catchblok, który jest nieco niechlujny, ponieważ tworzy zakres na poziomie bloku. I oczywiście przykład jest bardzo uproszczony, aby odpowiedzieć na zadane pytanie, nie obejmuje najlepszych praktyk w zakresie obsługi błędów;).

Евгений Савичев
źródło
0

Używam małej funkcji do sprawdzenia, czy zmienna została zadeklarowana, co naprawdę zmniejsza ilość bałaganu w moich plikach javascript. Dodaję sprawdzenie wartości, aby upewnić się, że zmienna nie tylko istnieje, ale także została przypisana wartość. Drugi warunek sprawdza, czy zmienna również została utworzona, ponieważ jeśli zmienna została zdefiniowana, ale nie utworzona (patrz przykład poniżej), nadal będzie generować błąd, jeśli spróbujesz odwołać się do jej wartości w kodzie.

Nie utworzony - var my_variable;Utworzony -var my_variable = "";

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

Następnie możesz użyć instrukcji warunkowej, aby sprawdzić, czy zmienna została zdefiniowana ORAZ utworzona instancja w ten sposób ...

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

lub w celu przetestowania, czy nie zostało zdefiniowane i utworzone wystąpienie ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
MistyDawn
źródło
1
Dlaczego nie od razu zwrócić orzeczenie? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski