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ć.
Dlaczego 'window.variableName'? Jeśli zmienna jest lokalna, to zmieni się niezdefiniowana, nawet jeśli zdefiniowana jest zmienna. –
Ponadto bycie "niezerowym" jest ortogonalne do tego, czy wartość zmiennej to "fałsz". –
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 –