Mam funkcję, którą napisałem, która w zasadzie wygląda tak:
function getNextCard(searchTerms) {
// Setup Some Variables
// Do a bunch of logic to pick the next card based on termed passed through what I'll call here as 'searchTerms' all of this logic is omitted because it's not important for my question.
// ...
// If we find a next card to give, than give it
if (nextCardFound)
return nextCardFound;
// Otherwise - I'm returning undefined
return undefined;
}
Pytanie: Czy lepiej byłoby zwrócić tutaj „null”?
Mogę oddać cokolwiek zechcę - oczywiście ... Po prostu nie byłam pewna, co najlepiej użyć.
Kod, który wywołuje tę funkcję, wie, jak radzić sobie z undefined (tak naprawdę nigdy się nie wydarzy, chyba że coś pójdzie nie tak)
Powodem, dla którego zadaję to pytanie, jest to, że gdzieś usłyszałem coś, co brzmiało jak „Nie przypisuj wartości niezdefiniowanej do zmiennych” lub coś takiego - że utrudni to debugowanie. Tak więc fakt, że widzę, że null
jest przekazywany z powrotem, mówi mi, że zwrot działa - ale zasadniczo działa podobnie do undefined
.
Dokumentacja:
Dokumenty Mozilla nie odpowiedziały na moje pytanie ... Google też nie: \
To TAK pytanie - było zbyt szerokie, jak na to, co próbuję tutaj zrozumieć.
null
. Zostawundefined
sam JavaScript. Nie ma jednak „lepszego”, więc to kwestia opinii.null
jako „nie ma odpowiedniej wartości dla tego, o co prosisz” iundefined
jako „Nie mogę zrozumieć, o co prosisz”.Odpowiedzi:
Będę argumentował, że nie ma najlepszego sposobu, a nawet standardowe funkcje czasami wybierają jedną lub drugą.
Na przykład:
[[Prototyp]]
Zwykłe obiekty mają wewnętrzną szczelinę [[Prototype]], która określa, z jakiego innego obiektu dziedziczą. Oczywiście musi istnieć sposób, aby powiedzieć, że obiekt nie dziedziczy po żadnym innym. W tym przypadku „nie ma takiego obiektu” jest reprezentowane za pomocą
null
.Object.getOwnPropertyDescriptor
Oczekuje się, że zwróci deskryptor właściwości, czyli obiekt, który opisuje właściwość (np. Wartość, możliwość zapisu, wyliczalność i konfigurowalność). Jednak nieruchomość może nie istnieć. W tym przypadku „nie ma takiej właściwości” jest reprezentowane za pomocą
undefined
.document.getElementById
Oczekuje się, że zwróci element o podanym identyfikatorze. Jednak może nie być elementu z tym identyfikatorem. W tym przypadku „nie ma takiego elementu” jest reprezentowane za pomocą
null
.Więc po prostu wybierz to, co wolisz lub uważasz, że ma większy sens w Twoim konkretnym przypadku.
źródło
void 0
przyszłym widzom technikę tej odpowiedzi. Dodałem też trochę kodu, aby wyjaśnić twój punkt widzenia. Dziękuję za Twoją odpowiedź!Undefined zazwyczaj odnosi się do czegoś, co nie zostało jeszcze przypisane (jeszcze). Null odnosi się do czegoś, co ostatecznie nie ma wartości. W takim przypadku zalecam zwrócenie wartości null. Zwróć uwagę, że funkcja bez określonej wartości zwracanej niejawnie zwraca wartość undefined.
Ze specyfikacji ECMAScript2015
http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type
Czytaj dalej:
Kiedy wartość null lub undefined jest używana w JavaScript?
źródło
var x=someFunc();
, celowo przypisuję wartość xa i wolałbym, aby nie przechodził żadnych testów, które wskazują, że nie została (lub mogła nie mieć) przypisana wartość. Justnull
), o ile trzymasz się jednego, ale posiadanie 2 wartości wskazujących na brak wartości (bez względu na „typ”) zawsze jest mylącePodam ci mój osobisty uparty sposób wyboru między tymi dwoma.
Moje proste pytanie brzmi: czy można zdefiniować wartość, biorąc pod uwagę inne dane wejściowe / stan / kontekst?
Jeśli odpowiedź brzmi tak, użyj
null
else użyjundefined
. Mówiąc bardziej ogólnie, każda funkcja zwracająca obiekt powinna zwrócić,null
gdy zamierzony obiekt nie istnieje. Ponieważ może istnieć przy innym wejściu / stanie / kontekście.null
reprezentuje brak wartości dla danego wejścia / stanu / kontekstu. To pośrednio oznacza, że pojęcie samej wartości istnieje w kontekście twojej aplikacji, ale może być nieobecne. W twoim przykładzie istnieje koncepcja następnej karty, ale sama karta może nie istnieć.null
powinien być używany.undefined
niejawnie reprezentuje brak znaczenia tej wartości w kontekście aplikacji. Na przykład, jeśli manipulujęuser
obiektem z podanym zestawem właściwości i próbuję uzyskać dostęp do właściwościpikatchu
. Wartość tej właściwości powinna być ustawiona na,undefined
ponieważ w moim kontekście nie ma sensu mieć takiej właściwości.źródło
null
, podczas gdy funkcje ze skutkami ubocznymi powinny powrócićundefined
, gdy myśli się jak programista funkcjonalny.undefined
nie jest czymś, do czego powinieneś przypisywać. Możesz rozważyć zwrot czegoś innego niżundefined
. W twoim przypadku, nawet jeśli w ogóle nic nie zwrócisz, wynik będzieundefined
już. Więc proponujęnull
zamiast tego.Rozważ tę próbkę,
function getSomething() { // .. do something return undefined; } function doSomething() { // .. I'm not gonna return anything. } var a = getSomething(); var b = doSomething();
Wynik powyższej próbki to
a === b
, czyliundefined
. Różnica polega na tym, że zapisujesz wykonanie 1 instrukcji.źródło
undefined
nie musi być przypisany. Wszystkie zadeklarowane zmienne bez wartości są jużundefined
.(function(){ /* code */ })()
zwraca wartość null w konsoli.undefined
na mojej konsoli Chrome i Firefox.undefined
jeśli coś innego nie wróci wcześniej - nie muszę, ponieważ domyślne zachowanie funkcji, jeśli nie zwracasz niczego, to zwracasz undefined - po prostu mówią, że nie jest to potrzebne. Co więcej ... Podoba mi się to, co miałeś do powiedzenia o wbudowanych funkcjach getter zwracających wartość null. Prosimy o przesłanie odpowiedzi w tej sprawie, a ja ją przyjmuję.Zależy od tego, co musisz zrobić ze zwróconą wartością.
typeof null zwraca obiekt. ten obiekt ma wartość undefined
typeof undefined zwraca undefined
źródło
typeof
niekoniecznie zwraca prawdziwy typ danych wartości, ma mapę, która mapuje typy danych na etykiety i zwraca odpowiednią etykietę.typeof
, pomimo swojej nazwy, nie podaje typu wartości.Oto przykład, w którym
undefined
ma więcej sensu niżnull
:Używam funkcji opakowującej,
JSON.parse
która konwertuje wyjątek naundefined
:// parses s as JSON if possible and returns undefined otherwise // return undefined iff s is not a string or not parseable as JSON; undefined is not a valid JSON value https://stackoverflow.com/a/14946821/524504 function JSON_parse_or_undefined(s) { if ("string" !== typeof s) return undefined try { const p = JSON.parse(s) return p } catch (x){} return undefined }
Zauważ, że
null
jest to poprawne w JSON, aundefined
nie.źródło
let getStringOrJSON = value => { try { value = JSON.parse(value); } catch(e) { return value; } return value; };
. Teraz jestem pewien, że te dwa zwroty można potraktować inaczej i mogą nie wygrać zawodów golfowych JS. To działa.Twierdziłbym, że w tym przypadku
null
powinien zostać zwrócony.Jeśli wziąć pod uwagę kwestię z teoretycznego punktu widzenia informatyki następnie niezdefiniowana służy do wskazania zakaz wypowiedzenia / non-obliczalności (czyli zastępczy nieokreślonym punkcie
x
z częściową funkcjąf
, która jest często napisanef(x) = ⊥
).getNextCard
wydaje się jednak, że jest w stanie obliczyć następną kartę (jeśli istnieje), a także być w stanie obliczyć, jeśli nie ma następnej karty. Innymi słowy, funkcja jest całkowita ponieważ kończy się dla każdego wejścia.Mając to na uwadze, wymagana jest specjalna wartość zakończenia sygnalizacji bez znaczącego wyniku (tj. „Nie ma karty, którą mogę zwrócić dla tego wejścia”), a dla mnie
null
nie jestundefined
.UWAGI:
Możesz zobaczyć pewne wsparcie dla tego argumentu w niektórych innych językach z typami typów, gdzie zakończenie bez znaczącego wyniku jest wyrażane za pomocą typu opcji (czasami nazywanego również typem dopuszczającym wartość null ). Przykładem tego jest Może w Haskell .
Z drugiej strony, oczywiście nie wiemy, co
undefined
tak naprawdę ma oznaczać JavaScript. Tak więc analogia do undefined jest nieco wątpliwa. Co więcej, ponieważ zawsze chcemy pracować z funkcjami całkowitymi, oznacza to „nigdy nie wracajundefined
z funkcji”. Co wydaje się być nieco surowe, ponieważ ograniczyłoby użycieundefined
do właściwości / zmiennych, które nie zostały ustawione.Ostatecznie wolę nigdy nie wracać
undefined
tam, gdzie mogę wrócić,null
i argumentowałbym również, że jest to lepsza konwencja kodowania (ponieważ między innymix !== null
jest krótsza niżtypeof x !== 'undefined'
).źródło
Pierwsza odpowiedź jest prawidłowa. Mają teoretycznie inne znaczenie. Jednak nie zawsze jest jasne, który wybrać.
Zwykle używam null w moim rozwoju, chociaż myślę, że jest to całkowicie subiektywne.
Używam tego głównie dlatego, że:
niezdefiniowana zmienna może zostać nadpisana w starszych przeglądarkach, więc jej zwrócenie jest nieco bardziej skomplikowane. Ten sam problem zmusza do korzystania
typeof var === 'undefined'
z wyników funkcji. połączyćInne języki często używają wartości null w szerokim zakresie, wiele z nich nie ma nawet wartości undefined (na przykład php). To daje mi pewną konsekwencję podczas szybkiego przełączania się między językami.
źródło
Myślę, że jest bardzo dyskusyjne, czego użyć. Wolę kod, który jest semantycznie tak dokładny, jak to tylko możliwe, więc myślę
undefined
jest odpowiedni w tym przypadku.Myślę o
null
przypisaniach jako o „zmiennej ustawionej na nic”. To w przeciwieństwie doundefined
znaczenia „tego w ogóle nie ma”Jak wskazano w poprzedniej odpowiedzi, powrót
undefined
wiąże się z problemami i od Ciebie zależy, czy to Ci przeszkadza. Nie przeszkadzałoby mi to.źródło
document.getElementById('iDoNotExist')
powracanull
, mimo że znaczenie jest bliższe „tego czegoś w ogóle nie ma”. Jeśli standardowe metody to robią, dlaczego nie OP?Moja osobista opinia, zgodnie z moim doświadczeniem, brzmi: nie używaj undefined i null, jeśli nie chcesz zepsuć kodu. Przynajmniej uniknąłbym tego osobiście. W JavaScript jest wiele funkcji, które zwracają wartość undefined i ok, musimy do tego użyć. Ale kiedy projektujesz swój kod, nie używaj go. Ważne jest, aby zawsze
"false"
przynajmniej coś zwrócić . Na przykład, jeśli masz tablicę i mapujesz ją. Nie jest dobrze wracać[undefined, undefined.....]
ani po prostuundefined
. Lepiej, jeśli zachowasz typ oryginalnej tablicy. Przykład:const mapper:Map <string[],boolean[]> ['i', 'dont', 'use', 'null or undefined'] -> [false, true, false, true, false] or ['', dont, '', '', use] or al the stuff above and then filter(v => v) that will keep all undefined and null out
To jest pomysł. Cały czas staram się tego uniknąć. Ponieważ
null
lubundefined
może łatwo spowodować awarię koduźródło