2013-02-26 12 views
7

Jestem nieco zdezorientowany, jak najlepiej sprawdzić, czy zmienna jest niezdefiniowana, czy nie w javascript. Robiłem to tak:sprawdzanie niezdefiniowanej w javascript - czy powinienem używać typeof czy nie?

myVar === undefined; 

Ale czy we wszystkich przypadkach lepiej używać zamiast niego typeof?

typeof myVar === undefined; 

A co z wykorzystaniem undefined vs "undefined", który ja też widziałem?

+4

'typeof' zwraca ciąg, więc powinieneś porównać jego wynik z' 'undefined" 'jeśli używasz operator porównania ścisłego. –

+1

Jeśli chcesz tylko wiedzieć, czy 'myVar' ma wartość niefałszowalną, wystarczyłoby'! '. (np. 'if (! myVar)' – marekful

+0

@ Frédéric Hamidi - dziękuję za wyjaśnienie Czy używasz (lub polecasz) używając typeof w większości przypadków? W każdych okolicznościach? Pytam, ponieważ widziałem 'myVar === undefined' używane w renomowanych książkach, dlatego go używam. – larryq

Odpowiedz

14

Jest to najlepszy sposób, aby sprawdzić - całkowicie niezawodne:

typeof myVar === "undefined" 

Jest OK, ale może zawodzić, jeśli ktoś unhelpfully nadpisałeś globalny undefined wartość:

myVar === undefined; 

to musi Mówimy, że ECMAScript 5 określa, że ​​undefined jest tylko do odczytu, więc powyższe będzie zawsze bezpieczne w każdej przeglądarce, która jest zgodna.

To nigdy nie zadziała, ponieważ kończy się porównując "undefined" === undefined (różne rodzaje):

typeof myVar === undefined; 
+0

Dlaczego jest to zaakceptowana odpowiedź? AFAIK, próbując uzyskać dostęp do nieokreślonej przestrzeni pamięci, zawsze będzie generować odwołanie ReferenceError zarówno w ES5 i ES6: https://jsfiddle.net/Troop4Christ/on2oynvz/ i http://www.es6fiddle.net/ijls28o5/ – RavenHursT

+0

@RavenHursT: That's nie chodzi o to pytanie - choć przyznano, przykładowy kod podany w pytaniu nie jest najlepszy. Bardziej przypomina to, co się dzieje [tutaj] (https://jsfiddle.net/on2oynvz/1/). Jeśli chodzi o 'ReferenceError', istnieje przynajmniej [to pytanie] (http://stackoverflow.com/q/9981104/50079), które obejmuje to, o czym wiem, ponieważ mam tam również odpowiedź. – Jon

2

Test ten będzie zawsze działać zgodnie z oczekiwaniami:

typeof a === 'undefined' 

Ponieważ wartość undefined może być zmieniony, takie testy nie zawsze są niezawodne:

a = {} 
a.b === undefined 

W tych przypadkach można przetestować przed void 0 zamiast:

a.b === void 0 
// true 

Jednak to nie będzie działać dla pojedynczych testów zmiennych:

a === void 0 // <-- error: cannot find 'a' 

Można było obejść, że poprzez badanie przed window.a, ale pierwszy metoda powinna być preferowana.

0

Uważam, że w najczęstszych przypadkach, np. podczas sprawdzania, czy parametr jest przekazywany przez funkcję, wystarcza myVar === undefined, ponieważ myVar będzie zawsze zadeklarowany jako parametr

Powiązane problemy