Często widzę kod JavaScript, który sprawdza niezdefiniowane parametry w ten sposób:
if (typeof input !== "undefined") {
// do stuff
}
Wydaje się to trochę marnotrawstwem, ponieważ obejmuje zarówno wyszukiwanie typu, jak i porównywanie ciągów, nie mówiąc już o szczegółowości. Jest to potrzebne, ponieważ undefined
można go zmienić.
Moje pytanie brzmi: w
jaki sposób ten kod jest lepszy od tego podejścia:
if (null != input) {
// do stuff
}
O ile mi wiadomo, nie można na nowo zdefiniować null
, więc nie pęknie niespodziewanie. Z powodu przymusu !=
operatora operator sprawdza to zarówno undefined
i null
... co często jest dokładnie tym, czego chcesz (np. Opcjonalnymi parametrami funkcji).
Jednak ta forma nie wydaje się powszechna, a nawet powoduje, że JSLint krzyczy na ciebie za użycie złego !=
operatora.
Dlaczego jest to uważane za zły styl?
źródło
if (null != input)
to tylko „Yoda Speak” dla anglojęzycznego (jednego z nich jestem… uuammmmm), więc jeśli równa się to samo, to tak naprawdę jest to tylko semantyka. MOIM ZDANIEM.Odpowiedzi:
typeof
jest bezpieczniejszy, ponieważ pozwala nigdy nie zadeklarować identyfikatora wcześniej:źródło
==
może być lepiej, ponieważ sprawdza zarówno wartość zerową, jak i niezdefiniowaną.!==
lub===
podczas porównywania wartości, której typem jest ciąg znaków.Jeśli zmienna jest zadeklarowana (za pomocą
var
słowa kluczowego, jako argument funkcji lub jako zmienna globalna), myślę, że najlepszym sposobem na to jest:jQuery to robi, więc jest dla mnie wystarczająco dobry :-)
W przeciwnym razie będziesz musiał użyć,
typeof
aby uniknąćReferenceError
.Jeśli spodziewasz się, że niezdefiniowane zostanie ponownie zdefiniowane, możesz owinąć swój kod w następujący sposób:
Lub uzyskaj go za pośrednictwem
void
operatora:źródło
undefined
to nazwa nadana parametrowi funkcji, a nie jego wartość. Nic nie jest przekazywane do funkcji, co oznacza, że wartość pierwszego parametru jest niezdefiniowana.dobry sposób:
Ale najlepiej wyglądającym sposobem jest sprawdzenie za pomocą:
źródło
if (typeof neverDeclared === typeof undefined) {
ale Lint zgłasza błąd. „Spodziewałem się ciągu i zamiast tego zobaczyłem„ typeof ”.” Jak obejdziesz ten błąd? Czy powinniśmy podporządkować się żądaniom Linta i zamiast tego skorzystać z „dobrej drogi”?typeof neverDeclared === typeof void 0
;-Dif(typeof neverDeclared === typeof undefined_variable_with_a_name_assumed_to_be_never_defined) {
ale jest to dość długie.Naprawdę nie powinieneś się martwić, że nazwa niezdefiniowana zostanie zmieniona. Jeśli ktoś zmieni niezdefiniowaną nazwę, będziesz miał o wiele więcej kłopotów niż tylko kilka, jeśli kontrole się nie powiodą. Jeśli naprawdę chcesz chronić swój kod, umieść go w IFFE (natychmiast wywołane wyrażenie funkcji) w następujący sposób:
Jeśli pracujesz ze zmiennymi globalnymi (co już jest niepoprawne) w środowisku przeglądarki, sprawdziłbym, czy nie są zdefiniowane w ten sposób:
Ponieważ zmienne globalne są częścią obiektu okna, możesz po prostu sprawdzić przed niezdefiniowanym zamiast rzutować na ciąg i porównywać ciągi.
Ponadto, dlaczego twoje zmienne nie są zdefiniowane? Widziałem dużo kodu, w którym sprawdzają istnienie zmiennych i wykonują na tej podstawie pewne działania. Ani razu nie widziałem, gdzie to podejście było prawidłowe.
źródło
Jeśli naprawdę martwisz się przedefiniowaniem niezdefiniowanego, możesz zabezpieczyć się przed tym za pomocą metody pomocniczej, takiej jak ta:
To działa, ponieważ kiedy ktoś pisze
undefined = "foo"
tylko on pozwala na imięundefined
odniesienie do nowej wartości, ale nie zmienia się wartość rzeczywistąundefined
.źródło
undefined_check
na górze, a następnie po prostu użyć jej wszędzie w kodzie.typeof
sprawdzanie.Możesz także użyć operatora void, aby uzyskać niezdefiniowaną wartość:
(I tak, jak zauważono w innej odpowiedzi, spowoduje to błąd, jeśli zmienna nie zostanie zadeklarowana, ale ten przypadek można często wykluczyć przez kontrolę kodu lub przez refaktoryzację kodu, np. Użycie
window.input !== void 0
do testowania zmiennych globalnych lub dodawanievar input
).źródło
Natknąłem się na to, jeśli
(typeof input !== 'undefined')
w tym scenariuszu jest on używany do zapewnienia domyślnych parametrów funkcji:ES6 zapewnia nowe sposoby wprowadzania domyślnych parametrów funkcji w ten sposób:
Jest to mniej gadatliwe i czystsze niż pierwsza opcja.
źródło
źródło
źródło
źródło
działa dobrze. To nie jest oczywiście w
null
porównaniu, ale zwykle uważają, że jeśli trzeba rozróżniaćundefined
inull
, faktycznie raczej trzeba rozróżniaćundefined
i byle wartość false, więcczy to.
Jeśli program przedefiniuje
undefined
, to i tak jest naprawdę braindead.Jedynym powodem, dla którego mogę wymyślić kompatybilność z IE4, nie zrozumiałem
undefined
słowa kluczowego (które nie jest tak naprawdę słowem kluczowym, niestety), ale oczywiście mogą to być wartościundefined
, więc musiałeś to mieć:a powyższe porównanie działałoby dobrze.
W drugim przykładzie prawdopodobnie potrzebujesz podwójnych nawiasów, aby uszczęśliwić kłaczki?
źródło
input == undefined
powrócitrue
nanull
wejściu.