Pisałem JavaScript już od dłuższego czasu i nigdy nie miałem powodu, aby go używać null
. Wydaje się, że undefined
jest to zawsze lepsze i programowo służy temu samemu celowi. Jakie są praktyczne powody, aby używać null
zamiast undefined
?
javascript
null
undefined
Jimmy Cuadra
źródło
źródło
document.getElementById()
które mogą zwracać,null
ale nieundefined
, więc w takich przypadkach dlaczego miałbyś testować zwrotundefined
? (Jasne, zadziałałoby, gdybyś użył==
zamiast===
, ale nadal, dlaczego celowo miałbyś testować pod kątem niewłaściwej rzeczy?)document.getElementById('does-not-exist')
.). Zmiennevar a;
i funkcje zwracają wartości domyślnie niezdefiniowane. W przeszłości wartość null znajdowała się w zasięgu globalnym, więc użycie go spowolniło wykonywanie i skłoniło mnie do preferowania innych fałszywych typów (fałsz, „, 0)” zamiast swobodnych odwołań. Osobiście unikam null, chyba że istnieje ważny powód, który jest inny, ponieważ uważam, że jest to prostsze, co generalnie jest lepsze.Odpowiedzi:
Null i undefined to zasadniczo dwie różne wartości, które oznaczają to samo. Jedyną różnicą są konwencje, w jakich używasz ich w swoim systemie. Jak niektórzy wspomnieli, niektórzy ludzie używają null w znaczeniu „brak obiektu”, gdzie czasami możesz otrzymać obiekt, podczas gdy undefined oznacza, że nie oczekiwano żadnego obiektu (lub że wystąpił błąd). Mój problem z tym polega na tym, że jest to całkowicie arbitralne i zupełnie niepotrzebne.
To powiedziawszy, jest jedna zasadnicza różnica - zmienne, które nie zostały zainicjowane (w tym między innymi parametry funkcji, dla których nie przekazano żadnego argumentu) są zawsze niezdefiniowane.
Dlatego w moim kodzie nigdy nie używam wartości null, chyba że coś, czego nie kontroluję, zwróci wartość null (na przykład dopasowanie wyrażeń regularnych). Piękno tego polega na tym, że bardzo upraszcza to. Nigdy nie muszę sprawdzać, czy x === undefined || x === null. A jeśli masz zwyczaj używania == lub po prostu rzeczy takich jak if (x) .... Przestań.
!x
zwróci wartość true dla pustego łańcucha, 0, null, NaN - czyli rzeczy, których prawdopodobnie nie chcesz. Jeśli chcesz napisać javascript, który nie jest okropny, zawsze używaj potrójnego równa się === i nigdy nie używaj null (zamiast tego użyj undefined). To znacznie ułatwi ci życie.źródło
===
lub!==
. JS to fantastycznie wyrazisty język, jeśli wiesz, jak go używać.null
/undefined
była konieczna, ponieważ pierwotna wersja JS nie miałahasOwnProperty
aniin
operatora. Teraz, kiedy tak jest, nie bardzo rozumiem, dlaczego jedna z nich nie została zniesiona w ES6 ani w żadnej z propozycji ES7, które widziałem.Naprawdę nie mam odpowiedzi, ale według Nicholasa C. Zakasa na stronie 30 jego książki „ Professional JavaScript for Web Developers ” :
źródło
undefined
oznacza to katastrofę. Po prostu imho.var myVar;
i jawnie sprawdzić wartość,undefined
aby określić, czy została później wypełniona odwołaniem do obiektu. Chodzi mi o to, że jest to całkowicie akademickie - możesz to zrobić w dowolny sposób, a każdy, kto doradza jedną, a nie drugą, po prostu forsuje własną konwencję.undefined
inull
. To wciąż jest naprawdę irytujące. Unikam przypisywania zmiennejnull
tylko po to, aby zmniejszyć liczbę dodatkowychnull
testów.==
porównanie (w przeciwieństwie do===
) ma sens:v == null
(lubv == undefined
) sprawdzi, czy nie ma wartości null lub undefined.Na koniec dnia, ponieważ oba
null
iundefined
zmuszają do tej samej wartości (Boolean(undefined) === false && Boolean(null) === false
), możesz technicznie użyć dowolnego, aby wykonać zadanie. Jest jednak właściwy sposób, IMO.Pozostaw użycie
undefined
kompilatora JavaScript.undefined
służy do opisywania zmiennych, które nie wskazują na odniesienie. Jest to coś, czym zajmie się za Ciebie kompilator JS. W czasie kompilacji silnik JS ustawi wartość wszystkich podniesionych zmiennych naundefined
. Gdy silnik przechodzi przez kod i wartości stają się dostępne, silnik przypisze odpowiednie wartości do odpowiednich zmiennych. W przypadku tych zmiennych, dla których nie znalazł wartości, zmienne nadal zachowywały odniesienie do prymitywuundefined
.Używaj wartości null tylko wtedy, gdy jawnie chcesz oznaczyć wartość zmiennej jako „bez wartości”.
Jak stwierdza @ com2gz:
null
służy do definiowania czegoś programowo pustego.undefined
oznacza, że odniesienie nie istnieje.null
Wartość ma zdefiniowaną odniesienie do „niczego”. Jeśli wywołujesz nieistniejącą właściwość obiektu, otrzymaszundefined
. Jeśli miałbym uczynić tę nieruchomość celowo pustą, to musi byćnull
tak, abyś wiedział, że jest celowo.TLDR; Nie używaj
undefined
prymitywów. Jest to wartość, którą kompilator JS automatycznie ustawi za Ciebie, gdy deklarujesz zmienne bez przypisania lub próbujesz uzyskać dostęp do właściwości obiektów, do których nie ma odniesienia. Z drugiej strony, użyjnull
wtedy i tylko wtedy, gdy celowo chcesz, aby zmienna nie miała „wartości”.Nigdy wyraźnie nie ustawiłem niczego na niezdefiniowane (i nie spotkałem się z tym w wielu bazach kodu, z którymi miałem kontakt). Rzadko używam
null
. Używam tylkonull
sytuacji, gdy chcę oznaczyć wartość argumentu funkcji jako pozbawioną wartości, tj .:źródło
nieokreślone jest wtedy, gdy nie istnieje żadne pojęcie rzeczy; nie ma typu i nigdy wcześniej nie było do niego odwołań w tym zakresie; null jest tam, gdzie wiadomo, że istnieje, ale nie ma wartości.
źródło
Każdy ma swój własny sposób kodowania i własną wewnętrzną semantykę, ale przez lata odkryłem, że jest to najbardziej intuicyjna rada, której udzielam osobom zadającym to pytanie: w razie wątpliwości rób to, co robi JavaScript .
Powiedzmy, że pracujesz z właściwościami obiektu, takimi jak opcje wtyczki jQuery ... zadaj sobie pytanie, jaką wartość JavaScript daje właściwość, która nie została jeszcze zdefiniowana - odpowiedź brzmi
undefined
. Dlatego w tym kontekście zainicjowałbym te typy rzeczy wartością „undefined”, aby była zgodna z JavaScriptem (w przypadku zmiennych możesz zrobićvar myVar;
zamiastvar myVar = undefined;
).Powiedzmy teraz, że robisz manipulację DOM ... jaką wartość przypisuje JavaScript nieistniejącym elementom? Odpowiedź to
null
. Jest to wartość, którą zainicjowałbym, jeśli tworzysz zmienną zastępczą, która później będzie zawierała odniesienie do elementu, fragmentu dokumentu lub czegoś podobnego, który odnosi się do DOM.Jeśli pracujesz z JSON, musisz zrobić specjalny przypadek: dla niezdefiniowanych wartości właściwości powinieneś ustawić je na
""
lubnull
ponieważ wartośćundefined
nie jest uważana za właściwy format JSON.Mając to na uwadze, jak wyraził poprzedni plakat, jeśli okaże się, że inicjujesz rzeczy z
null
lubundefined
więcej niż raz na niebieskim księżycu, może powinieneś ponownie rozważyć, jak zabrać się za kodowanie aplikacji.źródło
Możesz przyjąć sugerowaną tutaj konwencję, ale tak naprawdę nie ma ku temu dobrego powodu. Nie jest używany wystarczająco konsekwentnie, aby mieć znaczenie.
Aby konwencja była użyteczna, najpierw musisz wiedzieć, że wywoływana funkcja jest zgodna z konwencją. Następnie musisz jawnie przetestować zwracaną wartość i zdecydować, co zrobić. Jeśli otrzymujesz undefined , możesz założyć, że wystąpił jakiś błąd , o którym wiedziała wywoływana funkcja . Ale jeśli wystąpił błąd, a funkcja wiedziała o tym, i warto wysłać to w szersze środowisko, dlaczego nie użyć obiektu błędu? czyli wyrzucić błąd?
Ostatecznie więc konwencja jest praktycznie bezużyteczna w niczym innym niż w bardzo małych programach w prostych środowiskach.
źródło
Przydatna właściwość o wartości null, która nie została zdefiniowana :
Używam,
null
gdy chcę „wyłączyć” wartość numeryczną lub zainicjować jakąś. Moim ostatnim użyciem było manipulowanie transformacją CSS:Nie jestem pewien, czy powinienem skorzystać z tej właściwości ...
źródło
Węzły i elementy DOM nie są niezdefiniowane, ale mogą mieć wartość NULL.
NextSibling ostatniego elementu podrzędnego elementu ma wartość null.
Poprzedni element potomny pierwszego dziecka jest zerowy.
Odniesienie document.getElementById ma wartość null, jeśli element nie istnieje w dokumencie.
Ale w żadnym z tych przypadków wartość nie jest niezdefiniowana ; po prostu nie ma tam węzła.
źródło
window.myVar
zwróci „undefined”, jeśli nie istnieje. W JavaScript jest mnóstwo rzeczy, które zwracają „undefined”, ale jest mnóstwo rzeczy, które zwracają „null” - wszystko zależy od kontekstu.Kilku powiedziało, że inicjalizacja obiektów w programie jest w porządku
null
. Chciałem tylko zaznaczyć, że destrukturyzacja domyślnych argumentów nie działanull
. Na przykład:Wymaga to
null
sprawdzenia przed wywołaniem funkcji, co może się często zdarzać.źródło
Właśnie teraz pracuję nad tym pytaniem i przyglądam się następującej filozofii:
Dla mnie to pytanie jest znaczące, ponieważ każdy, kto wywołuje funkcję zwracającą wynik, nie powinien mieć pytania, czy testować pod kątem wartości undefined czy null.
Ta odpowiedź nie dotyczy:
Moim zdaniem zmienne są Twoją własną firmą i nie są częścią Twojego API, a właściwości w każdym systemie OO są zdefiniowane i dlatego powinny być zdefiniowane z wartością inną niż byłyby, gdyby nie zostały zdefiniowane (null dla zdefiniowanego, niezdefiniowane to uzyskać podczas uzyskiwania dostępu do czegoś, czego nie ma w obiekcie).
źródło
Oto powód:
var undefined = 1
jest to legalny skrypt javascript, alevar null = 1
jest to błąd składniowy. Różnica polega na tym, żenull
jest to słowo kluczowe języka, aundefined
z jakiegoś powodu nie.Jeśli twój kod opiera się na porównaniach,
undefined
tak jakby to było słowo kluczowe (if (foo == undefined)
- bardzo łatwy błąd), działa to tylko dlatego, że nikt nie zdefiniował zmiennej o takiej nazwie. Cały ten kod jest narażony na przypadkowe lub złośliwe zdefiniowanie zmiennej globalnej o tej nazwie. Oczywiście wszyscy wiemy, że przypadkowe zdefiniowanie zmiennej globalnej jest całkowicie niemożliwe w javascript ...źródło
void 0
zamiast undefined.Chcę tylko dodać, że przy użyciu niektórych bibliotek javascript, null i undefined mogą mieć niezamierzone konsekwencje.
Na przykład
get
funkcja lodash , która przyjmuje wartość domyślną jako trzeci argument:Inny przykład: jeśli używasz defaultProps w Reakcie, jeśli właściwość jest przekazywana
null
, domyślne właściwości nie są używane, ponieważ null jest interpretowane jako zdefiniowana wartość . na przykładźródło
Zupełnie nie zgadzam się, że użycie wartości null lub undefined jest niepotrzebne. undefined to rzecz, która podtrzymuje cały proces łączenia prototypów. Zatem kompilator tylko z wartością null nie może sprawdzić, czy ta właściwość jest równa null, czy też nie jest zdefiniowana w prototypie punktu końcowego. W innych językach z typami dynamicznymi (np. Python) rzuca wyjątek, jeśli chcesz uzyskać dostęp do niezdefiniowanej właściwości, ale w przypadku języków opartych na prototypach kompilator powinien również sprawdzić prototypy nadrzędne i tutaj jest miejsce, w którym niezdefiniowane najbardziej potrzebują.
Całe znaczenie używania wartości null polega po prostu na powiązaniu zmiennej lub właściwości z obiektem, który jest singletonem i ma znaczenie pustki, a także użycie wartości null ma na celu wydajność. Ten kod 2 ma różny czas wykonania.
źródło
undefined
nie ma specjalnego znaczenia dla dziedziczenia prototypów. Właściwość ustawiona naundefined
nadal przesłoni właściwość (o tej samej nazwie) odziedziczoną z prototypu.Nieznana zmienna:
undefined
.Jeszcze nie wiadomo zmienna wartość:
null
.server_object
.server_object.errj
. Mówi ci, że toundefined
. To znaczy, że nie wie, co to jest.server_object.err
. Mówi ci, że tonull
. Oznacza to, że odwołujesz się do poprawnej zmiennej, ale jest ona pusta; dlatego nie ma błędu.Problem polega na tym, że deklarujesz nazwę zmiennej bez wartości (
var hello
) js deklaruje, że jakoundefined
: ta zmienna nie istnieje; podczas gdy programiści mają na myśli głównie: „Nie nadałem mu jeszcze wartości”, definicjanull
.Zatem domyślne zachowanie programisty - deklarowanie zmiennej bez wartości jako nic - jest sprzeczne z js - deklarowanie jej jako nieistniejącej. A poza tym,
!undefined
i!null
oba są,true
więc większość programistów traktuje je jako równoważne.Możesz oczywiście upewnić się, że zawsze to robisz,
var hello = null
ale większość z nich nie zaśmieci swojego kodu jako takiego, aby zapewnić poprawność typu w umyślnie luźnym języku, gdy oni i!
operator traktują obaundefined
inull
jako równoważne.źródło