Natknąłem się na następujący kod:
function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}
Jestem trochę nowy w JavaScript, ale z innych pytań, które tu czytałem, mam wrażenie, że ten kod nie ma większego sensu.
Otrzymasz błąd, jeśli uzyskasz dostęp do niezdefiniowanej zmiennej w dowolnym kontekście innym niżtypeof
.
Aktualizacja: (cytat) powyższej odpowiedzi może wprowadzać w błąd. Powinien mówić „niezadeklarowana zmienna” zamiast „niezdefiniowana zmienna” .
Jak się dowiedziałem, w odpowiedziach Ryana ♦ , maerics i nwellnhof , nawet jeśli nie podano argumentów funkcji, jej zmienne dla argumentów są zawsze deklarowane. Fakt ten również okazuje się błędny w przypadku pierwszej pozycji na poniższej liście.
Z mojego zrozumienia mogą wystąpić następujące scenariusze:
Funkcja została wywołana bez argumentów, co spowodowałodata
utworzenie niezdefiniowanej zmiennej i spowodowanie błędu nadata != null
.Funkcja została wywołana specjalnie z
null
(lubundefined
) jako argumentem, w którym to przypadkudata != null
już chroni kod wewnętrzny, renderując&& data !== undefined
bezużytecznym.Funkcja została wywołana z argumentem różnym od null, w którym to przypadku w trywialny sposób przekaże oba
data != null
idata !== undefined
.
P: Czy moje rozumienie jest prawidłowe?
Próbowałem następujących rzeczy w konsoli Firefoksa:
--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true
Nie mogę wymyślić przypadku, w którym data !== undefined
po data != null
może się przydać.
źródło
if (data)
. Jest to mnemoniczny sposób w Javascript na sprawdzenie, czydata
zmienna ma wartość true.undefined
,null
False, 0, pusty łańcuch, pusta tablica i (?) Przedmiot bez właściwości FALSE, reszta jest prawdą.if(data)
oznaczałoby, że nie może przekazaćfalse
ani0
jako wartości dladata
.if(typeof someUndefVar == whatever) -- works
iif(someUnderVar) -- error
.data !== null && data !== undefined
, co jest równoważne temu,data != null
co jest równoważne zdata != undefined
. Dawna forma wydaje się być preferowane, ponieważ jest bardziej wyraźne o warunkach, podczas gdy byłoby łatwo przeoczyć, że zarównonull
iundefined
są sprawdzane z późniejszych dwóch warunków.undefined
to IMO zapach kodu. To nie jest chronione słowo kluczowe, jaknull
zmienna, która jest niezdefiniowana. To jest całkowicie poprawne i spowoduje złamanie twojego kodu:undefined = 1
Odpowiedzi:
„Niezdefiniowana zmienna” różni się od wartości
undefined
.Niezdefiniowana zmienna:
Zmienna o wartości
undefined
:Gdy funkcja przyjmuje argument, ten argument jest zawsze deklarowany, nawet jeśli jego wartość to
undefined
, więc nie będzie żadnego błędu. Masz jednak rację co!= null
do!== undefined
tego, że jesteś bezużyteczny.źródło
data !== null && data !== undefined
miałoby jednak sens.data != null
sprawdzałby obanull
iundefined
(ale, co ciekawe, tylkonull
iundefined
, a nie inne fałszywe wartości).W JavaScript
null
jest to specjalny obiekt typu singleton, który jest pomocny przy sygnalizowaniu „brak wartości”. Możesz to sprawdzić przez porównanie i, jak zwykle w JavaScript, dobrą praktyką jest użycie===
operatora, aby uniknąć mylącego wymuszania typu:Jak wspomina @rynah, „undefined” jest nieco mylące w JavaScript. Jednak zawsze można bezpiecznie sprawdzić, czy
typeof(x)
ciąg jest „niezdefiniowany”, nawet jeśli „x” nie jest zadeklarowaną zmienną:Ponadto zmienne mogą mieć „niezdefiniowaną wartość”, jeśli nie zostały zainicjowane:
Podsumowując, Twój czek powinien wyglądać następująco:
Jednakże, ponieważ zmienna „data” jest zawsze zdefiniowana, ponieważ jest formalnym parametrem funkcji, użycie operatora „typeof” jest niepotrzebne i można bezpiecznie porównać bezpośrednio z „niezdefiniowaną wartością”.
Ten fragment sprowadza się do stwierdzenia: „jeśli funkcja została wywołana z argumentem, który jest zdefiniowany i nie jest pusty…”
źródło
!= null
będzie prawdziwe dla wszystkich wartości z wyjątkiemnull
iundefined
, i jesteśmy pewni, że ta zmienna jest zadeklarowana.typeof
w innych sytuacjach może być nawet niebezpieczne - a co jeśli błędnie wpiszesz nazwę zmiennej? To może pozostać niewykryte przez długi czas, ponieważ nie ma błędu.!=
w ogóle, tylko ścisłe porównanie,!==
?===
), chyba że naprawdę wiesz, co robisz i chcesz porównać po konwersji (==
).undefined
. Ponadto Safari na iPadzie nie zrobi tego w żadnych okolicznościach. Nie możesz nawetdelete window.undefined
.W twoim przypadku użyj
data==null
(co jest prawdziwe TYLKO dla wartości null i undefined - na drugim obrazku skup się na wierszach / kolumnach null-undefined)Pokaż fragment kodu
Tutaj masz wszystko ( src ):
Jeśli
== (jego zaprzeczenie ! = )
=== (jego zaprzeczenie ! == )
źródło
P: Funkcja została wywołana bez argumentów, co spowodowało, że data stała się niezdefiniowaną zmienną i spowodowała błąd w danych! = Null.
O: Tak,
data
zostanie ustawiony na niezdefiniowany. Zobacz rozdział 10.5 Wiązanie deklaracji Instancja specyfikacji. Jednak dostęp do niezdefiniowanej wartości nie powoduje błędu. Prawdopodobnie mylisz to z dostępem do niezadeklarowanej zmiennej w trybie ścisłym, co powoduje błąd.P: Funkcja została wywołana specjalnie z null (lub niezdefiniowanym) jako argumentem, w którym to przypadku data! = Null już chroni kod wewnętrzny, renderując && data! == undefined bezużyteczne.
P: Funkcja została wywołana z argumentem różnym od null, w którym to przypadku w trywialny sposób przekaże zarówno dane! = Null, jak i dane! == undefined.
O: Dobrze . Zauważ, że następujące testy są równoważne:
Patrz sekcja 11.9.3 Algorytm abstrakcyjnego porównywania równości i sekcja 11.9.6 Algorytm ścisłego porównywania równości w specyfikacji.
źródło
data
to w ogóle by nie istniało, zamiast być ustawioneundefined
. Doceniam wyjaśnienie, a te odniesienia pomogły mi lepiej zrozumieć, jak działają obie równości.Myślę, że testowanie zmiennych pod kątem wartości, których się nie spodziewasz, nie jest ogólnie dobrym pomysłem. Ponieważ test jako swój możesz uznać za napisanie czarnej listy zabronionych wartości. Ale co, jeśli zapomnisz wymienić wszystkie zabronione wartości? Ktoś, nawet Ty, może złamać Twój kod, przekazując nieoczekiwaną wartość. Więc bardziej odpowiednim podejściem jest coś w rodzaju białej listy - testowanie zmiennych tylko dla oczekiwanych wartości, a nie nieoczekiwanych. Na przykład, jeśli oczekujesz, że wartość danych będzie ciągiem znaków, zamiast tego:
zrób coś takiego:
źródło
typeof foo === "undefined"
różni się odfoo === undefined
, nigdy ich nie myl.typeof foo === "undefined"
jest tym, czego naprawdę potrzebujesz. Używaj również!==
zamiast!=
Więc oświadczenie można zapisać jako
Edytować:
Nie można używać
foo === undefined
dla niezadeklarowanych zmiennych.źródło
foo === undefined
używanie jest niebezpieczne. Sprawia, że kod kończy się niepowodzeniem z powodu tego samego stanu, któremu próbowano zapobiec.foo === undefined
jest całkowicie akceptowalny w sytuacji PO (założenie,undefined
że nie zostało nadpisane). Odpowiedź nie wyjaśnia również, dlaczego!==
powinno się ją stosować zamiast!=
.Prosty sposób na wykonanie testu to:
źródło
data
jest ciąg znaków, ten test zwraca false na pustych ciągach, co może, ale nie musi, być odpowiednie (funkcja może w jakiś sposób poradzić sobie z pustym ciągiem).""
lub0
czyNaN
(lub innych) „czy” blok zostanie pominięty; co może, ale nie musi, być intencją OP.źródło
null
.