2012-02-07 10 views
8

Mam kawałek kodu, który testuje istnienie zmiennej, używając instrukcji if, jak przykład poniżej. Muszę zrobić jedną rzecz, jeśli var jest ustawiony, coś innego, jeśli nie jest. W pewnym przypadku testowego, var musiał być ustawiony na 0, ale to samo jest posiadanie unset var w JS, widocznie:JS: sprawdź istnienie var, który jest równy 0

var toMatch; 
toMatch = 0; 
if (!toMatch) { 
    document.write("no"); 
} else { 
    document.write(toMatch); 
} 

// html is "no" 

jsFiddle

Więc mój problem jest, w jaki sposób przetestuj dla var, jeśli jego wartość wynosi zero. Powinienem wskazać, że w mojej funkcji możliwe wartości do przekazania to 0-40 +.

W przeszłości używałem pracy podobnej do ustawiania wartości początkowej na tyle wysoko, że prawdopodobnie nie zostanie ona przekazana do funkcji, ale wydaje mi się, że jest to dla mnie hackey. Czy istnieje lepszy sposób na zrobienie tego?

Odpowiedz

14
var toMatch; 
toMatch = 0; 
if (toMatch === 0) { // or !== if you're checking for not zero 
    document.write("no"); 
} else { 
    document.write(toMatch); 
} 

toMatch === 0 sprawdzi zero.

toMatch === undefined sprawdzi undefined

potrójne równi ścisłe operatory porównania do tego rodzaju sytuacji. Zobacz to błogosławione pytanie: Difference between == and === in JavaScript

+0

Zauważ, że 'undefined' nie jest to słowo kluczowe i teoretycznie może być nadpisane. Polecam używając 'if (typeof (toMatch)! ==" undefined ")' lub zamknięcie kodu przez anonimową funkcję z dodatkowym parametrem dla 'undefined'. –

+1

Możesz również wspomnieć o tym, aby sprawdzić istnienie (niekoniecznie określonej wartości), które możesz zrobić: 'if (typeof toMatch! == 'undefined') {};' –

+0

Możesz również użyć '(void 0)' zamiast 'niezdefiniowanej' jeśli jesteś naprawdę paranoikiem :) –

0

Javascript jest nieco zabawny, jeśli chodzi o wartości i kontrole boolowskie. Proponuję przeczytać o Truthy and Falsey w JavaScript.

Należy użyć tożsamości nierówność operatora !==:

var toMatch; 
toMatch = 0; 
if (toMatch !== 0) { 
    document.write("no"); 
} else { 
    document.write(toMatch); 
} 

Warto również zrozumienie the differences between == and ===.

1

Można sprawdzić, czy nazwa jest zdefiniowana z:

if (typeof bad_name === "undefined") { 
+0

jest operatorem, a nie metodą. Powinno być 'if (typeof bad_name === undefined)' – Relic

+0

OK, poprawione. Nauczyłem się czegoś dzisiaj! :) –

+0

Kiedy po raz pierwszy zobaczyłem ten zapis, też byłem WTF ... mówi trochę o rzucaniu, a jeśli zanurkujesz głębiej, pomoże ci to w analizie właściwości. – Relic

1

Zamiast

if (toMatch) 

użycie

if (toMatch == null) 
+0

-1, ponieważ zawsze powinieneś używać absolutnie równego === w porównaniu do pustego/niezdefiniowanego (słowa kluczowe) – Relic

+1

Nie, "x == null" jest równoważne 'x === null || x === undefined'. Porównania do 'null' są jedynym przypadkiem, w którym powinieneś użyć' == '(na przykład przewodnik po jQuery popiera tę praktykę). Nie ma znaczenia fakt, że puste i niezdefiniowane słowa są zarezerwowane. –

+0

Wiem o tym, jest to po prostu leniwy ... i dopuszczasz możliwe wyjątki, chyba że jest to konkretne zachowanie, którego szukasz. Dobre praktyki JavaScript zawsze twierdzą, że używają absolutnie równego, ale znalazłem 1 lub 2 miejsca we wszystkich moich kodach, które są błędne w IE, więc muszę używać względnie równych. I oczywiście jQuery to potwierdza, to najlepsza biblioteka między przeglądarkami. To dlatego mają tak duży udział w rynku. – Relic

Powiązane problemy