2013-05-23 20 views
46

wiem, że istnieją dwa sposoby, aby ustalić, czy zmienna istnieje i niezerowy (false, pusty) w javascript:Sprawdzanie czy zmienna istnieje w javascript

1) if (typeof variableName !== 'undefined' && variableName)

2) if (window.variableName)

który jest bardziej preferowany i dlaczego?

+2

Dlaczego 'window.variableName'? Jeśli zmienna jest lokalna, to zmieni się niezdefiniowana, nawet jeśli zdefiniowana jest zmienna. –

+0

Ponadto bycie "niezerowym" jest ortogonalne do tego, czy wartość zmiennej to "fałsz". –

+1

Coffeescript ma swój własny operator dla tego problemu i wygenerowany z niego kod JS jest całkiem interesujący. http://stackoverflow.com/questions/9992620/coffeescript-existential-operator-and-tois –

Odpowiedz

67

Zmienna jest zadeklarowana jako, jeśli uzyskanie dostępu do nazwy zmiennej nie spowoduje wystąpienia odwołania ReferenceError. Jeśli wyrażenie typeof variableName !== 'undefined' będzie false tylko w jednym z dwóch przypadków:

  • zmienna nie została zadeklarowana (czyli nie ma var variableName zakres) lub
  • zmienna jest zadeklarowana, a jego wartość jest undefined (czyli wartość zmiennej jest niezdefiniowane)

przeciwnym razie porównanie ocenia się true.

Jeśli naprawdę chcesz, aby sprawdzić, czy zmienna jest zadeklarowana czy nie, musisz catch dowolnym ReferenceError produkowanego przez odniesienie do niego:

var barIsDeclared = true; 
try{ bar; } 
catch(e) { 
    if(e.name == "ReferenceError") { 
     barIsDeclared = false; 
    } 
} 

Jeśli chcesz jedynie sprawdzić, czy wartość zadeklarowanej zmiennej nie jest ani undefined ani null, można po prostu przetestować na nim:

if(variableName !== undefined && variableName !== null) { ... } 

Lub równoważnie, z non-ścisłego sprawdzania równości wobec null:

if(variableName != null) { ... } 

Zarówno Drugi przykład wyrażenie a prawy w testach && eksploatacji, jeżeli wartość jest „falsey”, to znaczy, jeśli to wymusza na false w kontekście logicznym. Takie wartości to: null, false, 0 i pusty łańcuch, z których nie wszystkie możesz odrzucić.

+0

Jaka jest różnica pomiędzy "zmienną nie jest zadeklarowana" i "zmienna jest niezadeklarowana"? –

+0

@TomasZubiri Nie ma różnicy; Właśnie zmieniłem "test, jeśli zmienna jest niezadeklarowana", aby "sprawdzić, czy zmienna jest zadeklarowana, czy nie". Mam nadzieję, że jest to bardziej jasne. – apsillers

+0

Och, rozumiem, ponieważ drugi test zwróciłby wartość false, gdyby zmienna została zadeklarowana, ale wartość była niezdefiniowana. –

16

Należy zauważyć, że "niezdefiniowana" jest idealnie poprawną wartością dla zmiennej, którą należy przytrzymać. Jeśli chcesz sprawdzić, czy zmienna istnieje w ogóle,

if (window.variableName) 

jest pełniejsza kontrola, ponieważ jest sprawdzenie, czy zmienna została faktycznie zdefiniowane. Jest to jednak użyteczne tylko wtedy, gdy zmienna jest gwarantowana jako obiekt! Ponadto, jak zauważyli inni, może to również zwrócić wartość false, jeśli wartość zmiennej nazwa_zmiennej to false, 0, '' lub null.

To powiedziawszy, zwykle nie wystarcza do naszych codziennych celów, ponieważ często nie chcemy mieć nieokreślonej wartości. Jako takie, powinieneś najpierw sprawdzić, czy zmienna jest zdefiniowana, a następnie stwierdzić, że nie jest ona niezdefiniowana za pomocą operatora typeof, który, jak wskazał Adam, nie zwróci niezdefiniowanego, chyba że zmienna naprawdę jest niezdefiniowana.

if (variableName && typeof variableName !== 'undefined') 
+0

Podczas gdy niezdefiniowane może być poprawną wartością dla zmiennej, sprawdzanie typeof nie zwróci undefined, chyba że zmienna naprawdę jest niezdefiniowana. – Adam

+3

'if (okno.variableName) 'ma poważną wadę, ponieważ zwraca fałszywy negatyw dla wszystkiego, co ** zostało ** zdefiniowane, ale jest falsy. Zatem wszelkie zmienne, które są "fałsz", "0", "" "," null "lub inne, dadzą zły wynik. –

+0

Dzięki za doskonałe punkty. Pomogło to również wzmocnić moje zrozumienie i zaktualizowałem swoją odpowiedź, aby odzwierciedlić Twoje komentarze. –

0

if (variable) mogą być stosowane, jeżeli zmienne jest gwarantowane obiektu, czy fałszywy, 0, itd. Są uważane za wartości „domyślne” (a więc odpowiadających nieokreślone lub zerową).

typeof variable == 'undefined' może być stosowany w przypadkach, gdy określona wartość pusta ma inne znaczenie niż niezainicjowana zmienna lub właściwość. To sprawdzenie nie spowoduje błędu, a zmienna błędu nie zostanie zadeklarowana.

1
if (typeof variableName !== 'undefined' && variableName) 
//// could throw an error if var doesnt exist at all 

if (window.variableName) 
//// could be true if var == 0 

////further on it depends on what is stored into that var 
// if you expect an object to be stored in that var maybe 
if (!!window.variableName) 
//could be the right way 

best way => see what works for your case 
5

Jeśli chcesz sprawdzić, czy zmienna (słownie v) został zdefiniowany i nie jest zerowy:

if (typeof v !== 'undefined' && v !== null) { 
    // Do some operation 
} 

Jeśli chcesz sprawdzić dla wszystkich wartości falsy takich jak: undefined, null, '', 0, false:

if (v) { 
    // Do some operation 
} 
3

Piszę odpowiedź tylko dlatego, że nie mają wystarczającej reputacji na COMM ent zaakceptowana odpowiedź od apsillers. zgadzam się z jego odpowiedzi, ale

If you really want to test if a variable is undeclared, you'll need to catch the ReferenceError ...

nie jest to jedyny sposób. Można to zrobić tylko:

this.hasOwnProperty("bar") 

aby sprawdzić, czy istnieje zmienna bar ogłoszony w bieżącym kontekście. (Nie jestem pewien, ale wywołanie hasOwnProperty może być również szybsze/skuteczniejsze niż podniesienie wyjątku) Działa to tylko dla bieżącego kontekstu (nie dla całego bieżącego zakresu).

0

Znalazłem to krótsza i znacznie lepiej:

if(varName !== (undefined || null)) { //do something } 
-1

Inne razy można mieć do czynienia z nim jako o wyjątku ReferenceError.

try { 
      //user variable 
      console.log(varName); 
    }catch(error){ 
     //variable is not defined 
     console.log(error); 
    } 
Powiązane problemy