Często używamy następującego wzorca kodu w naszym kodzie JavaScript
if (typeof(some_variable) != 'undefined' && some_variable != null)
{
// Do something with some_variable
}
Czy istnieje mniej szczegółowy sposób sprawdzania, który ma taki sam efekt?
Według niektórych forów i literatury po prostu poniższe powinny mieć ten sam efekt.
if (some_variable)
{
// Do something with some_variable
}
Niestety Firebug ocenia takie stwierdzenie, jak błąd w środowisku wykonawczym, gdy some_variable
jest niezdefiniowany, podczas gdy pierwszy z nich jest w porządku. Czy to tylko (niechciane) zachowanie Firebuga, czy naprawdę jest jakaś różnica między tymi dwoma sposobami?
javascript
null
undefined
Tomas Vana
źródło
źródło
if(some_variable) { ... }
nie zostanie wykonane, jeślisome_variable
jestfalse
lub0
...Odpowiedzi:
Musisz rozróżnić przypadki:
undefined
lub niezadeklarowane . Błąd pojawi się, jeśli uzyskasz dostęp do niezadeklarowanej zmiennej w innym kontekście niżtypeof
.Zmienna, która została zadeklarowana, ale nie została zainicjowana, to
undefined
.Niezdefiniowane właściwości , takie jak
someExistingObj.someUndefProperty
. Niezdefiniowana właściwość nie powoduje błędu i po prostu zwraca wartośćundefined
, którą po przekształceniu na wartość logiczną ocenia nafalse
. Więc jeśli nie przejmujesz się0
ifalse
używanieif(obj.undefProp)
jest w porządku. Istnieje wspólny idiom oparty na tym fakcie:co oznacza „jeśli
obj
ma właściwośćprop
, przypisz jąvalue
, w przeciwnym razie przypisz wartość domyślnądefautValue
”.Niektóre osoby uważają to zachowanie za mylące, argumentując, że prowadzi to do trudnych do znalezienia błędów, i
in
zamiast tego zalecają użycie operatoraźródło
undefined
.typeof
zwraca ciąg. Więc nievar myVar; typeof(myVar)==undefined
wraca .false
true
Myślę, że najskuteczniejszym sposobem sprawdzenia „wartości jest
null
lubundefined
” jestTe dwie linie są równoważne:
Notatka 1
Jak wspomniano w pytaniu, krótki wariant wymaga
some_variable
zadeklarowania, w przeciwnym razie zostanie zgłoszony błąd ReferenceError. Jednak w wielu przypadkach użycia można założyć, że jest to bezpieczne:sprawdź opcjonalne argumenty:
sprawdź właściwości istniejącego obiektu
Z drugiej strony
typeof
może radzić sobie z niezadeklarowanymi zmiennymi globalnymi (po prostu zwracaundefined
). Jednak przypadki te powinny zostać ograniczone do minimum z dobrych powodów, jak wyjaśnił Alsciende.Uwaga 2
Ten - nawet krótszy - wariant nie jest równoważny:
więc
Uwaga 3
Ogólnie zaleca się stosowanie
===
zamiast==
. Proponowane rozwiązanie stanowi wyjątek od tej reguły. Składnia sprawdzania JSHint nawet stanowieqnull
opcję dla tego powodu.Z przewodnika po stylu jQuery :
źródło
== null
jest najskuteczniejszym narzędziem do sprawdzania „zerowego lub niezdefiniowanego” (co jest tematem pytań). Nie jest to wcale rzadkie (używane 43 razy w jQuery 1.9.1), ponieważ bardzo często wiesz, że zmienna została zadeklarowana - lub testujesz właściwości istniejącego obiektu, takiego jakif( o.foo == null)
.window.someProperty == null
. W przypadku zmiennych lokalnych możesz łatwo upewnić się, że są zadeklarowane: zamiast pisaćif (...) {var local = ""}
napiszvar local; if (...) { local = ""; }
Sprawdzanie wartości null przy normalnej równości zwróci również wartość true dla niezdefiniowanej.
if (window.variable == null) alert('variable is null or undefined');
źródło
NaN
z równania różnicy nigdy nie można oczekiwać, że będzie równyW nowszych standardach JavaScript, takich jak ES5 i ES6, możesz po prostu powiedzieć
wszystkie zwracają wartość false, co jest podobne do sprawdzania pustych zmiennych przez Python. Więc jeśli chcesz napisać logikę warunkową wokół zmiennej, po prostu powiedz
tutaj „null” lub „pusty ciąg” lub „niezdefiniowany” będą obsługiwane sprawnie.
źródło
null
aundefined
inne wartości fałszowania powinny być prawdziwe!0
,NaN
. Dzieje się tak, gdy chcesz uchwycić prawdziwość obiektu bez zachowania odniesienia do obiektu, abyś mógł go przechowywać, a nie jakiś potencjalnie duży obiekt. FYI jest to również równoważne z tym!!value
, który pierwszy!
neguje prawdziwość, a drugi ponownie to neguje.if (var)
które zostanieBoolean(undefined)
działa, próba działania z niezdefiniowaną zmienną nie działa, i to jest cały sens sprawdzania, czy wartość jest pusta lub niezdefiniowana. To:if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }
zgłasza błąd ReferenceError z informacją: „Błąd ReferenceErr: undeclareVarName nie jest zdefiniowany”Jeśli spróbujesz odwołać się do niezadeklarowanej zmiennej, we wszystkich implementacjach JavaScript zostanie wygenerowany błąd.
Właściwości obiektów nie podlegają tym samym warunkom. Jeśli właściwość obiektu nie została zdefiniowana, błąd nie zostanie zgłoszony, jeśli spróbujesz uzyskać do niej dostęp. W tej sytuacji możesz skrócić:
do
Mając to na uwadze oraz fakt, że zmienne globalne są dostępne jako właściwości obiektu globalnego (
window
w przypadku przeglądarki), można użyć następujących zmiennych dla zmiennych globalnych:W zakresach lokalnych zawsze warto upewnić się, że zmienne są zadeklarowane u góry bloku kodu, co pozwoli zaoszczędzić na powtarzających się zastosowaniach
typeof
.źródło
if (myObj.some_property != null)
aby uzyskać równoważne zachowanie.Po pierwsze, musisz bardzo jasno określić, co testujesz. JavaScript ma wszelkiego rodzaju niejawne konwersje, które mogą cię zaskoczyć, oraz dwa różne rodzaje komparatorów równości:
==
i===
.Funkcja,
test(val)
która sprawdzanull
lubundefined
powinna mieć następujące cechy:Zobaczmy, które z pomysłów tutaj faktycznie przeszły nasz test.
Te prace:
Te nie działają:
Utworzyłem wpis jsperf, aby porównać poprawność i wydajność tych podejść. Na razie wyniki nie są jednoznaczne, ponieważ nie przeprowadzono wystarczającej liczby uruchomień w różnych przeglądarkach / platformach. Poświęć chwilę, aby uruchomić test na swoim komputerze!
Obecnie wydaje się, że prosty
val == null
test zapewnia najlepszą wydajność. Jest także prawie najkrótszy. Test może być zanegowany,val != null
jeśli chcesz uzupełnienia.źródło
jest to jedyny przypadek, w którym
==
należy zastosować:źródło
val != null
dla przeciwnej, tylko jeden=
, a ponieważ za @Yukulele to jedyny używać==
będziesz wiedzieć, co to jest, kiedy go zobaczyć.Ponieważ nie ma jednej pełnej i poprawnej odpowiedzi, postaram się podsumować:
Ogólnie wyrażenie:
nie można uprościć, ponieważ
variable
może to być niezadeklarowane, więc pominięcietypeof(variable) != "undefined"
spowoduje błąd ReferenceError. Ale możesz uprościć wyrażenie zgodnie z kontekstem :Jeśli
variable
jest globalny , możesz uprościć:Jeśli jest lokalny , prawdopodobnie można uniknąć sytuacji, w których ta zmienna nie jest zadeklarowana, a także uprościć:
Jeśli jest to właściwość object , nie musisz się martwić o ReferenceError:
źródło
navigator
częściąwindow
? Kiedy otrzymamy wyjąteknavigator is not defined
, czy możemy skorzystać zwindow.navigator != null
testu?Możesz po prostu sprawdzić, czy zmienna ma wartość, czy nie. Znaczenie,
Jeśli nie wiesz, czy zmienna istnieje (to znaczy, jeśli została zadeklarowana), powinieneś sprawdzić za pomocą operatora typeof. na przykład
źródło
Zrobiłem to przy użyciu tej metody
zapisz identyfikator w jakiejś zmiennej
następnie użyj warunku if
źródło
Jak wspomniano w jednej z odpowiedzi, możesz mieć szczęście, jeśli mówisz o zmiennej o zasięgu globalnym. Jak zapewne wiesz, zmienne zdefiniowane globalnie mają tendencję do dodawania do obiektu Windows. Możesz skorzystać z tego faktu, więc powiedzmy, że uzyskujesz dostęp do zmiennej o nazwie bleh, po prostu użyj podwójnie odwróconego operatora (!!)
Zwróci to wartość false, gdy bleh nie zostanie zadeklarowane ORAZ przypisana wartość.
źródło
oto inny sposób użycia metody Array zawiera () :
źródło
cokolwiek yyy jest niezdefiniowane lub zerowe, zwróci wartość true
tak
Nie
źródło
Otwórz narzędzia programistyczne w przeglądarce i po prostu wypróbuj kod pokazany na poniższym obrazku.
źródło
Aby to zrozumieć, przeanalizujmy, jaka będzie wartość zwracana przez silnik Javascript podczas konwersji niezdefiniowanych, zerowych i „” (również pusty ciąg znaków). Możesz to bezpośrednio sprawdzić na konsoli programisty.
Widać, że wszyscy przekształcają się w fałsz, co oznacza, że wszyscy ci trzej zakładają „brak istnienia” przez javascript. Nie musisz więc jawnie sprawdzać wszystkich trzech elementów w kodzie, jak poniżej.
Chciałbym również zwrócić uwagę na jeszcze jedną rzecz.
Jaki będzie wynik Boolean (0)?
Oczywiście fałszywe. Spowoduje to utworzenie błędu w kodzie, gdy 0 jest prawidłową wartością oczekiwanego wyniku. Więc upewnij się, że to zaznaczasz podczas pisania kodu.
źródło
Podobnie jak masz, możesz zrobić coś takiego
if (some_variable === undefined || some_variable === null) { do stuff }
źródło
Jest to przykład bardzo rzadkiej okazji, w której zaleca się stosowanie
==
zamiast===
. Wyrażeniesomevar == null
zwróci true dlaundefined
inull
, ale false dla wszystkiego innego (błąd, jeśli zmienna nie jest zadeklarowana).Używając
!=
spowoduje odwrócenie wyniku, zgodnie z oczekiwaniami.Nowoczesne edytory nie ostrzegają przed użyciem
==
lub!=
obsługąnull
, ponieważ prawie zawsze jest to pożądane zachowanie.Najczęstsze porównania:
Spróbuj sam:
źródło
Testowanie nieważności (
if (value == null)
) lub nieważności (if (value != null)
) jest mniej szczegółowe niż testowanie statusu definicji zmiennej.Ponadto testowanie
if (value)
(lubif( obj.property)
) w celu zapewnienia istnienia zmiennej (lub właściwości obiektu) kończy się niepowodzeniem, jeśli jest zdefiniowanafalse
wartością logiczną . Zastrzegł emptor :)źródło
Obie wartości można łatwo rozróżnić za pomocą operatora ścisłego porównania:
Przykład roboczy w:
http://www.thesstech.com/tryme?filename=nullandundefined
Przykładowy kod:
źródło
Jeśli celem instrukcji if jest sprawdzenie wartości
null
lubundefined
wartości przed przypisaniem wartości do zmiennej, możesz skorzystać z Nullish Coalescing Operator , jest on ostatecznie dostępny w JavaScript, chociaż obsługa przeglądarki jest ograniczona. Według danych z caniuse obsługiwanych jest tylko 48,34% przeglądarek (stan na kwiecień 2020 r.).Zapewni to, że zmienna zostanie przypisana do pustego ciągu (lub dowolnej innej wartości domyślnej), jeśli
some_variable
jestnull
lubundefined
.Ten operator jest najbardziej odpowiedni dla twojego przypadku użycia, ponieważ nie zwraca wartości domyślnej dla innych typów wartości fałszowania, takich jak
0
i''
.źródło
Musisz zdefiniować funkcję tego formularza:
źródło
W ES5 lub ES6, jeśli potrzebujesz tego sprawdzić kilka razy, możesz:
źródło
Dzięki Ramda możesz po prostu zrobić
R.isNil(yourValue)
Lodash, a inne biblioteki pomocnicze mają tę samą funkcję.źródło