Byłoby wspaniale, gdyby w tytule dodano ostatnie pytanie. Odpowiedzi tutaj są niesamowite, ale tytuł może nie wskazywać, że znajdziesz tę odpowiedź tutaj
marcos.borunda
6
Null nie jest obiektem w JavaScript! typeof null === 'object'ale to jest błąd! Oto link Obejrzyj wszystkie filmy i ciesz się :)
KR
1
Lubię używać C / C ++ jako prawdy aksjomatycznej do tego, czym jest zmienna niezdefiniowana i o wartości NULL, ponieważ jest bardzo prosta. Następnie sprawdź, jak te definicje porównują się do specyfikacji innych języków.
samis,
Odpowiedzi:
1488
(name is undefined)
Ty: co to jest name? (*) JavaScriptname :? Co to jest name? Nie wiem o czym mówisz. Nigdy wcześniej o tym nie wspominałeś name. Czy widzisz jakiś inny język skryptowy po stronie (klienta)?
name =null;
Ty: co to jest name? JavaScript: nie wiem.
W skrócie; undefinedjest tam, gdzie nie istnieje pojęcie rzeczy; nie ma żadnego typu i nigdy wcześniej nie był przywoływany w tym zakresie; nullto miejsce, o którym wiadomo, że istnieje, ale nie wiadomo, jaka jest wartość.
Jedną rzeczą do zapamiętania jest to, że nullnie jest, koncepcyjnie, takie same jak falselub ""czy takie, nawet jeśli przyrównać po odlewaniu typu, tj
name =false;
Ty: co to jest name? JavaScript: Boolean false.
name ='';
Ty: co to jest name? JavaScript: pusty ciąg
*: namew tym kontekście należy rozumieć zmienną, która nigdy nie została zdefiniowana. Może to być dowolna niezdefiniowana zmienna, jednak nazwa jest właściwością niemal dowolnego elementu formularza HTML. To sięga daleko, dawno temu i zostało ustanowione na długo przed id. Jest to przydatne, ponieważ identyfikatory muszą być unikalne, ale nazwy nie muszą być.
Ale w JavaScript pusty ciąg „” jest wciąż wartością logiczną boolowską.
Andreas Grech
117
Pusty ciąg nie jest logiczną wartością false, ale w kontekście warunkowym jest interpretowany jako wartość false (y) (przymus).
Bryan Matthews,
22
W drugim przypadku, gdy name = null, zamiast „nie wiem”, JavaScript może odpowiedzieć: Obiekt null. Poza tym podoba mi się styl odpowiedzi.
Jean Vincent
16
Zamiast „nie wiem” powiedziałbym, że odpowiedź nullbrzmi „nic”. Null jest precyzyjnie zdefiniowany jako brak wartości. Void, zero, nada. Nic.
mikl
50
Uwielbiam ten styl odbierania. Ogólnie rzecz biorąc, „nigdy wcześniej o tym nie wspominałeś name” jest prawdą. Jednak zadeklarowanie zmiennej bez przypisania jej wartości ( var somevar;) będzie zaskakująco wystarczające undefined.
@ kentaromiura Dla nas JavaScript noobs ... może tylko ja ... jaka jest ta składnia logiczna (wartość)? Przesyłanie do logiki?
xr280xr
@ xr280xr Tak, to casting. Spróbuj String(null)zobaczyć inny przykład castingu. Możesz nawet robić głupie rzeczy, takie jak Number(null + 2)... ale nie powinieneś :-). Doskonała odpowiedź od kentaromiury.
squidbe
Pamiętaj, typeofjest operatorem. Nie owinąłbyś operandu w nawias z tego samego powodu, dla którego nie napisałeś var sum = 1 +(1);.
alex
124
nullto nie jest obiektem , jest to prymitywny wartość . Na przykład nie można dodawać do niego właściwości. Czasami ludzie błędnie zakładają, że jest to obiekt, ponieważ typeof nullpowraca "object". Ale tak naprawdę jest to błąd (który można nawet naprawić w ECMAScript 6).
Różnica między nulli undefinedjest następująca:
undefined: używany przez JavaScript i oznacza „bez wartości”. Niezainicjowane zmienne, brakujące parametry i nieznane zmienne mają tę wartość.
Zasadniczo należy zawsze używać === i nigdy == w JavaScript (== wykonuje wszelkiego rodzaju konwersje, które mogą dawać nieoczekiwane wyniki). Sprawdzenie x == nulljest przypadkiem na krawędzi, ponieważ działa zarówno w przypadku, jak nulli undefined:
>null==nulltrue>undefined==nulltrue
Częstym sposobem sprawdzania, czy zmienna ma wartość, jest konwersja jej na wartość logiczną i sprawdzenie, czy tak jest true. Ta konwersja jest wykonywana przez ifinstrukcję i operator logiczny! ("nie").
function foo(param){if(param){// ...}}function foo(param){if(! param) param ="abc";}function foo(param){// || returns first operand that can't be converted to false
param = param ||"abc";}
Wada tego podejścia: Wszystkie poniższe wartości oceniają na false, więc musisz być ostrożny (np. Powyższe kontrole nie rozróżniają między undefinedi 0).
undefined, null
Booleany: false
Liczby: +0, -0,NaN
Smyczki: ""
Możesz przetestować konwersję na wartość logiczną, używając Booleanjako funkcji (zwykle jest to konstruktor, którego można używać new):
Po co odwoływać się +0i -0osobno, jeśli +0 === -0?
Raynos,
6
Prawdopodobnie dlatego, że nadal można odróżnić +0i -0: 1/+0 !== 1/-0.
neo
1
Ta odpowiedź prowadzi do postu, który prowadzi z powrotem do tej odpowiedzi jako źródła ... prawdopodobnie miał na myśli link do tego zamiast 2ality.com/2013/10/typeof-null.html
Ricardo Tomasi
No tak, jak w C, gdzie niezainicjowane deklaracje zmiennych są uważane za niezdefiniowane (stare wersje mogą faktycznie zawierać dane poprzednich programów).
samis,
5
„Ale tak naprawdę jest to błąd (który można nawet naprawić w ECMAScript 6)” - źródło?
Gajus
26
Jaka jest różnica między wartością zerową a niezdefiniowaną?
Właściwość, która nie ma definicji, jest niezdefiniowana. null jest obiektem. Jego typ to obiekt. null to specjalna wartość oznaczająca „brak wartości. undefined nie jest obiektem, jego typ jest niezdefiniowany.
Możesz zadeklarować zmienną, ustawić ją na null, a zachowanie jest identyczne, z wyjątkiem tego, że zobaczysz wydruk „null” i „niezdefiniowany”. Możesz nawet porównać zmienną niezdefiniowaną do wartości null lub odwrotnie, a warunek będzie spełniony:
Powinieneś użyć ===, a następnie niezdefiniowany! == null: D
olliej
1
zwróćcie
6
! obiekt nie jest tym samym, co „object == null” ... W rzeczywistości są one zupełnie inne. ! obiekt zwróci wartość true, jeśli obiekt ma wartość 0, pusty ciąg znaków, wartość logiczną fałszu, niezdefiniowaną lub pustą.
James
3
Czy wartość null jest naprawdę przedmiotem? Pierwszy podany link sprawdza null według typeof, ale typeof (null) przyjmuje wartość „obiekt” z powodu błędu projektowania języka.
c4il
2
nullnie jest przedmiotem. Że typeof null == 'object';powraca prawda jest ze względu na błąd, który nie może być ustalony w JavaScript (obecnie, ale może się zmienić w przyszłości).
Mohamad
21
Pierwsza część pytania:
Dlaczego wartość null jest uważana za obiekt w JavaScript?
Jest to błąd projektowy JavaScript, którego nie mogą teraz naprawić. Powinien to być typ null, nie typ obiektu lub wcale go nie mieć. Wymaga dodatkowej kontroli (czasem zapomnianej) podczas wykrywania rzeczywistych obiektów i jest źródłem błędów.
Druga część pytania:
Sprawdza
if (object == null) Do something
to samo co
if (!object) Do something
Oba kontrole są zawsze fałszywe, z wyjątkiem:
obiekt jest niezdefiniowany lub pusty: oba są prawdziwe.
obiekt jest prymitywny, a 0 ""lub false: najpierw sprawdź false, drugi true.
Jeśli obiekt nie jest prymitywny, ale prawdziwy obiekt, jak new Number(0), new String("")lub new Boolean(false), po czym obie kontrole są fałszywe.
Więc jeśli „obiekt” jest interpretowany jako prawdziwy Obiekt, wówczas obie kontrole są zawsze takie same. Jeśli operacje podstawowe są dozwolone, kontrole są różne dla 0 ""i fałsz.
W takich przypadkach object==nullnieoczywiste wyniki mogą być źródłem błędów. Stosowanie ==nie jest zalecane kiedykolwiek użyć ===zamiast.
Trzecia część pytania:
A także:
Jaka jest różnica między wartością zerową a niezdefiniowaną?
W JavaScript jedną różnicą jest to, że null ma typ obiektu, a undefined jest typu undefined.
W JavaScript null==undefinedjest prawdziwe i uważane za równe, jeśli typ jest ignorowany. Dlaczego tak postanowili, ale 0 ""i fałsz nie są sobie równe, nie wiem. To wydaje się arbitralna opinia.
W JavaScript null===undefinednie jest prawdą, ponieważ typ musi być taki sam w ===.
W rzeczywistości wartości zerowe i niezdefiniowane są identyczne, ponieważ oba reprezentują nieistnienie. Podobnie jak 0, i jeśli ""o to chodzi, być może puste pojemniki []i {}. Tak wiele rodzajów tego samego niczego nie jest receptą na błędy. Jeden typ lub żaden nie jest lepszy. Spróbowałbym użyć jak najmniej.
„false”, „true” i „!” są kolejną torbą robaków, którą można uprościć, na przykład if(!x)i if(x)same są wystarczające, nie potrzebujesz prawdy i fałszu.
Zadeklarowany var xtyp jest niezdefiniowany, jeśli nie podano żadnej wartości, ale powinien być taki sam, jakby x nigdy nie został zadeklarowany. Innym źródłem błędów jest pusty pojemnik na nic. Więc najlepiej jest to zadeklarować i zdefiniować razem var x=1.
Ludzie chodzą w kółko w kółko, próbując odkryć te różne rodzaje niczego, ale to wszystko to samo w skomplikowanych różnych ubraniach. Rzeczywistość jest
Świetna odpowiedź, ale idzie trochę za daleko z []: „ W rzeczywistości wartości null i undefined są identyczne ... a może puste pojemniki [] i {}. ” Prawdopodobnie możesz namówić mnie do myślenia, że {} powinno być trochę smak null, ale mam wrażenie, że nie powinno. Ale mniej kontrowersyjnie, pusta tablica, []co zrozumiałe, ma .push()funkcję , więc nie ma dobrego argumentu na to, aby [] była pusta. 0,02 USD.
ruffin,
11
var x =null;
x jest zdefiniowane jako null
y nie jest zdefiniowane; // ponieważ go nie zdefiniowałem
Nowa funkcjonalność jest w ciągłym ruchu. Zwraca null:
var proto =Object.getPrototypeOf(Object.getPrototypeOf({}));// But this returns undefined:Object.getOwnPropertyDescriptor({},"a");
Wszystkie pozostałe przypadki nieistnienia są oznaczone jako niezdefiniowane (jak zauważył @Axel). Każdy z następujących wydruków jest „niezdefiniowany”:
Oczywiście, jeśli zdecydujesz się napisać var unitialised = null; lub samodzielnie zwróć wartość NULL z metody, wówczas w innych sytuacjach wystąpi NULL. Ale to powinno być dość oczywiste.
Trzeci przypadek ma miejsce, gdy chcesz uzyskać dostęp do zmiennej, ale nawet nie wiesz, czy została zadeklarowana. W takim przypadku użyj typeof, aby uniknąć błędu odniesienia:
if(typeof unknown !=="undefined"){//use unknown}
Podsumowując, sprawdź wartość null, gdy manipulujesz DOM, masz do czynienia z Ajaxem lub używasz niektórych funkcji ECMAScript 5. We wszystkich innych przypadkach można bezpiecznie sprawdzić, czy nie jest zdefiniowana z zachowaniem ścisłej równości:
robi „var myUndefined”; zdefiniować zmienną (jako znaną zmienną o nieznanym typie)?
Qi Fan
6
zarówno null, jak i undefined są równe false dla równości wartości (null == undefined): oba zwinięte są w wartość logiczną false. Nie są tym samym obiektem (null! == undefined).
undefined jest właściwością obiektu globalnego („okna” w przeglądarkach), ale jest typem pierwotnym, a nie samym obiektem. Jest to wartość domyślna dla niezainicjowanych zmiennych i funkcji kończących się bez instrukcji return.
null jest instancją Object. wartość null jest używana dla metod DOM, które zwracają obiekty kolekcji w celu wskazania pustego wyniku, co zapewnia fałszywą wartość bez wskazywania błędu.
Możesz rozważyć undefinedreprezentację na poziomie systemu, nieoczekiwany lub podobny do błędu brak wartości i nullreprezentację na poziomie programu, normalny lub oczekiwany brak wartości. Jeśli musisz przypisać jedną z tych wartości do zmiennej lub właściwości lub przekazać jedną z tych wartości do funkcji, nullprawie zawsze jest właściwym wyborem.
źle - zarówno nulli undefinedsą wartościami prymitywne - typeof null === 'object'jest to błąd język, boObject(null) !== null
Christoph
Nie nie jest. Object () rzutował pracę w ten sposób, patrz ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf - 15.2.2.1 nowy Object ([wartość]) ... 8. (Wartość argumentu nie został podany lub jego typ to Null lub Undefined.) Utwórz nowy natywny obiekt ECMAScript. Właściwość [[Prototyp]] nowo zbudowanego obiektu jest ustawiona na obiekt prototypowy Obiekt. Właściwość [[Class]] nowo zbudowanego obiektu jest ustawiona na „Object”. Nowo zbudowany obiekt nie ma właściwości [[Wartość]]. Zwraca nowo utworzony obiekt macierzysty.
kentaromiura
3
@Christoph: Mam na myśli, masz rację. null powinien być typem, co mam na myśli, że nie można tego sprawdzić w ten sposób, ponieważ: alert (new Object ()! == new Object ()); / * true, nowe istnienie nie jest tym samym istnieniem / alertem (Object (null) .constructor == {} .constructor); / true jak w spec / alert (Object (null) .prototype == {} .prototype); / true jak w spec / alert (null instanceof Object); / oczywiście fałsz, wartość null oznacza brak wystąpienia * / Ale w zasadzie jest to błąd specyfikacji XD patrz: uselesspickles.com/blog/2006/06/12/… i javascript.crockford.com/remedial.html
kentaromiura
2
Poniższa funkcja pokazuje, dlaczego i jest w stanie ustalić różnicę:
function test(){var myObj ={};
console.log(myObj.myProperty);
myObj.myProperty =null;
console.log(myObj.myProperty);}
Jeśli zadzwonisz
test();
Dostajesz
nieokreślony
zero
Pierwsze console.log(...)próbuje uzyskać myPropertyod myObjnatomiast nie jest jeszcze określona - tak to wróci „nieokreślone”. Po przypisaniu mu wartości null druga console.log(...)zwraca oczywiście „null”, ponieważ myPropertyistnieje, ale ma nullprzypisaną wartość .
Aby móc sprawdzić tę różnicę, JavaScript ma nulli undefined: Chociaż nulljest - podobnie jak w innych językach obiekt, undefinednie może być obiektem, ponieważ nie ma dostępnej instancji (nawet nullinstancji).
Czy potrafisz wyjaśnić różnicę między tymi dwoma warunkami
rahul
przeczytaj moją odpowiedź, oznacza to, że jeśli o jest równe 0, false lub „” wartość logiczna to false: var undef, various = [0, ””, null, false, undef]; for (var obj in different) {alert (! obj); // 4 razy fałsz w IE, 5 w FF;)}
kentaromiura
2
Inną zabawną rzeczą w przypadku wartości null w porównaniu do niezdefiniowanej jest to, że można ją zwiększać.
x =undefined
x++
y =null
y++
console.log(x)// NaN
console.log(y)// 0
W Javascriptnull nie jest objecttypem, jest primitavetypem.
Jaka jest różnica? Niezdefiniowany odnosi się do wskaźnika, który nie został ustawiony.
Null odnosi się do wskaźnika zerowego, na przykład coś ręcznie ustawiło zmienną na typnull
Z „The Principles of Object-Oriented Javascript” autorstwa Nicholasa C. Zakasa
Ale dlaczego obiekt, gdy typ jest pusty? (W rzeczywistości został uznany za błąd przez komitet TC39, który projektuje i utrzymuje JavaScript. Mógłbyś rozumieć, że null jest wskaźnikiem pustego obiektu, co powoduje, że „obiekt” jest logiczną wartością zwracaną, ale nadal jest mylący.)
Zakas, Nicholas C. (2014-02-07). Zasady obiektowego JavaScript (lokalizacje Kindle 226-227). Brak prasy skrobiowej. Wersja Kindle.
To mówi:
var game =null;//typeof(game) is "object"
game.score =100;//null is not an object, what the heck!?
game instanceofObject;//false, so it's not an instance but it's type is object//let's make this primitive variable an object;
game ={};typeof(game);//it is an object
game instanceofObject;//true, yay!!!
game.score =100;
Nieokreślona sprawa:
var score;//at this point 'score' is undefinedtypeof(score);//'undefined'var score.player ="felix";//'undefined' is not an object
score instanceofObject;//false, oh I already knew that.
Najlepszym sposobem, aby pomyśleć o „null”, jest przypomnienie, jak podobna koncepcja jest używana w bazach danych, gdzie wskazuje, że pole nie zawiera „żadnej wartości”.
Tak, wartość przedmiotu jest znana; to jest „określony”. To nie została zainicjowana.
Wartość przedmiotu to: „nie ma wartości”.
Jest to bardzo przydatna technika pisania programów, które są łatwiejsze do debugowania. Nieokreślona zmienna może być wynikiem błędu ... (skąd byś wiedział?) ... ale jeśli zmienna zawiera wartość „null”, wiesz, że „ktoś gdzieś w tym programie ustaw ją na „null.” „Dlatego sugeruję, aby gdy trzeba pozbyć się wartości zmiennej, nie„ usuwaj ”... ustaw ją na„ null ”. Stara wartość zostanie osierocona i wkrótce zostanie wyrzucona do kosza; nowa wartość to „nie ma żadnej wartości (teraz)”. W obu przypadkach stan zmiennej jest pewny: „oczywiście, celowo, udało się to”.
Niezdefiniowana oznacza, że zmienna została zadeklarowana, ale nie przypisano jej żadnej wartości, natomiast Null można przypisać do zmiennej reprezentującej „brak wartości” (Null jest operatorem przypisania)
2. Nieokreślony jest typem, podczas gdy Null jest obiektem.
3. Javascript może sam zainicjować dowolną nieprzypisaną zmienną na niezdefiniowaną, ale nigdy nie może ustawić wartości zmiennej na null. Należy to zrobić programowo.
typeof null === 'object'
ale to jest błąd! Oto link Obejrzyj wszystkie filmy i ciesz się :)Odpowiedzi:
Ty: co to jest
name
? (*)JavaScript
name
:? Co to jestname
? Nie wiem o czym mówisz. Nigdy wcześniej o tym nie wspominałeśname
. Czy widzisz jakiś inny język skryptowy po stronie (klienta)?Ty: co to jest
name
?JavaScript: nie wiem.
W skrócie;
undefined
jest tam, gdzie nie istnieje pojęcie rzeczy; nie ma żadnego typu i nigdy wcześniej nie był przywoływany w tym zakresie;null
to miejsce, o którym wiadomo, że istnieje, ale nie wiadomo, jaka jest wartość.Jedną rzeczą do zapamiętania jest to, że
null
nie jest, koncepcyjnie, takie same jakfalse
lub""
czy takie, nawet jeśli przyrównać po odlewaniu typu, tjTy: co to jest
name
?JavaScript: Boolean false.
Ty: co to jest
name
?JavaScript: pusty ciąg
*:
name
w tym kontekście należy rozumieć zmienną, która nigdy nie została zdefiniowana. Może to być dowolna niezdefiniowana zmienna, jednak nazwa jest właściwością niemal dowolnego elementu formularza HTML. To sięga daleko, dawno temu i zostało ustanowione na długo przed id. Jest to przydatne, ponieważ identyfikatory muszą być unikalne, ale nazwy nie muszą być.źródło
null
brzmi „nic”. Null jest precyzyjnie zdefiniowany jako brak wartości. Void, zero, nada. Nic.name
” jest prawdą. Jednak zadeklarowanie zmiennej bez przypisania jej wartości (var somevar;
) będzie zaskakująco wystarczająceundefined
.Różnicę można streścić w tym fragmencie:
Kontrola
object == null
jest inny do sprawdzeniaif ( !object )
.Ta ostatnia jest równa
! Boolean(object)
, ponieważ!
operator jednoargumentowy automatycznie rzuca odpowiedni operand na wartość logiczną.Ponieważ
Boolean(null)
równa się wtedy fałsz!false === true
.Więc jeśli obiekt jest nie zerowa , ale fałszywe lub 0 lub „” , kontrola minie, ponieważ:
źródło
String(null)
zobaczyć inny przykład castingu. Możesz nawet robić głupie rzeczy, takie jakNumber(null + 2)
... ale nie powinieneś :-). Doskonała odpowiedź od kentaromiury.typeof
jest operatorem. Nie owinąłbyś operandu w nawias z tego samego powodu, dla którego nie napisałeśvar sum = 1 +(1);
.null
to nie jest obiektem , jest to prymitywny wartość . Na przykład nie można dodawać do niego właściwości. Czasami ludzie błędnie zakładają, że jest to obiekt, ponieważtypeof null
powraca"object"
. Ale tak naprawdę jest to błąd (który można nawet naprawić w ECMAScript 6).Różnica między
null
iundefined
jest następująca:undefined
: używany przez JavaScript i oznacza „bez wartości”. Niezainicjowane zmienne, brakujące parametry i nieznane zmienne mają tę wartość.Jednak dostęp do nieznanych zmiennych powoduje wyjątek:
null
: używane przez programistów do wskazywania „brak wartości”, np. jako parametr funkcji.Badanie zmiennej:
Zasadniczo należy zawsze używać === i nigdy == w JavaScript (== wykonuje wszelkiego rodzaju konwersje, które mogą dawać nieoczekiwane wyniki). Sprawdzenie
x == null
jest przypadkiem na krawędzi, ponieważ działa zarówno w przypadku, jaknull
iundefined
:Częstym sposobem sprawdzania, czy zmienna ma wartość, jest konwersja jej na wartość logiczną i sprawdzenie, czy tak jest
true
. Ta konwersja jest wykonywana przezif
instrukcję i operator logiczny! ("nie").Wada tego podejścia: Wszystkie poniższe wartości oceniają na
false
, więc musisz być ostrożny (np. Powyższe kontrole nie rozróżniają międzyundefined
i0
).undefined
,null
false
+0
,-0
,NaN
""
Możesz przetestować konwersję na wartość logiczną, używając
Boolean
jako funkcji (zwykle jest to konstruktor, którego można używaćnew
):źródło
+0
i-0
osobno, jeśli+0 === -0
?+0
i-0
:1/+0 !== 1/-0
.Właściwość, która nie ma definicji, jest niezdefiniowana. null jest obiektem. Jego typ to obiekt. null to specjalna wartość oznaczająca „brak wartości. undefined nie jest obiektem, jego typ jest niezdefiniowany.
Możesz zadeklarować zmienną, ustawić ją na null, a zachowanie jest identyczne, z wyjątkiem tego, że zobaczysz wydruk „null” i „niezdefiniowany”. Możesz nawet porównać zmienną niezdefiniowaną do wartości null lub odwrotnie, a warunek będzie spełniony:
Więcej informacji można znaleźć w JavaScript Różnica między wartością zerową a niezdefiniowaną .
a przy nowej edycji tak
podczas testowania, czy obiekt jest fałszywy, oba spełniają warunek tylko podczas testowania, jeśli jest fałszywy , ale nie gdy jest prawdziwy
Sprawdź tutaj: Javascript gotcha
źródło
null
nie jest przedmiotem. Żetypeof null == 'object';
powraca prawda jest ze względu na błąd, który nie może być ustalony w JavaScript (obecnie, ale może się zmienić w przyszłości).Pierwsza część pytania:
Jest to błąd projektowy JavaScript, którego nie mogą teraz naprawić. Powinien to być typ null, nie typ obiektu lub wcale go nie mieć. Wymaga dodatkowej kontroli (czasem zapomnianej) podczas wykrywania rzeczywistych obiektów i jest źródłem błędów.
Druga część pytania:
Oba kontrole są zawsze fałszywe, z wyjątkiem:
obiekt jest niezdefiniowany lub pusty: oba są prawdziwe.
obiekt jest prymitywny, a 0
""
lub false: najpierw sprawdź false, drugi true.Jeśli obiekt nie jest prymitywny, ale prawdziwy obiekt, jak
new Number(0)
,new String("")
lubnew Boolean(false)
, po czym obie kontrole są fałszywe.Więc jeśli „obiekt” jest interpretowany jako prawdziwy Obiekt, wówczas obie kontrole są zawsze takie same. Jeśli operacje podstawowe są dozwolone, kontrole są różne dla 0
""
i fałsz.W takich przypadkach
object==null
nieoczywiste wyniki mogą być źródłem błędów. Stosowanie==
nie jest zalecane kiedykolwiek użyć===
zamiast.Trzecia część pytania:
W JavaScript jedną różnicą jest to, że null ma typ obiektu, a undefined jest typu undefined.
W JavaScript
null==undefined
jest prawdziwe i uważane za równe, jeśli typ jest ignorowany. Dlaczego tak postanowili, ale 0""
i fałsz nie są sobie równe, nie wiem. To wydaje się arbitralna opinia.W JavaScript
null===undefined
nie jest prawdą, ponieważ typ musi być taki sam w===
.W rzeczywistości wartości zerowe i niezdefiniowane są identyczne, ponieważ oba reprezentują nieistnienie. Podobnie jak 0, i jeśli
""
o to chodzi, być może puste pojemniki[]
i{}
. Tak wiele rodzajów tego samego niczego nie jest receptą na błędy. Jeden typ lub żaden nie jest lepszy. Spróbowałbym użyć jak najmniej.„false”, „true” i „!” są kolejną torbą robaków, którą można uprościć, na przykład
if(!x)
iif(x)
same są wystarczające, nie potrzebujesz prawdy i fałszu.Zadeklarowany
var x
typ jest niezdefiniowany, jeśli nie podano żadnej wartości, ale powinien być taki sam, jakby x nigdy nie został zadeklarowany. Innym źródłem błędów jest pusty pojemnik na nic. Więc najlepiej jest to zadeklarować i zdefiniować razemvar x=1
.Ludzie chodzą w kółko w kółko, próbując odkryć te różne rodzaje niczego, ale to wszystko to samo w skomplikowanych różnych ubraniach. Rzeczywistość jest
I może wszyscy powinni rzucać wyjątki.
źródło
[]
co zrozumiałe, ma.push()
funkcję , więc nie ma dobrego argumentu na to, aby [] była pusta. 0,02 USD.x jest zdefiniowane jako null
y nie jest zdefiniowane; // ponieważ go nie zdefiniowałem
wartość null jest oceniana jako fałsz
źródło
Jednym ze sposobów nadania wartości zerowej i niezdefiniowanej jest zrozumienie, gdzie występuje każda z nich.
Oczekuj zerowej wartości zwracanej w następujących sytuacjach:
Metody kwerendujące DOM
Odpowiedzi JSON otrzymane z żądania Ajax
RegEx.exec .
Nowa funkcjonalność jest w ciągłym ruchu. Zwraca null:
Wszystkie pozostałe przypadki nieistnienia są oznaczone jako niezdefiniowane (jak zauważył @Axel). Każdy z następujących wydruków jest „niezdefiniowany”:
Oczywiście, jeśli zdecydujesz się napisać var unitialised = null; lub samodzielnie zwróć wartość NULL z metody, wówczas w innych sytuacjach wystąpi NULL. Ale to powinno być dość oczywiste.
Trzeci przypadek ma miejsce, gdy chcesz uzyskać dostęp do zmiennej, ale nawet nie wiesz, czy została zadeklarowana. W takim przypadku użyj typeof, aby uniknąć błędu odniesienia:
Podsumowując, sprawdź wartość null, gdy manipulujesz DOM, masz do czynienia z Ajaxem lub używasz niektórych funkcji ECMAScript 5. We wszystkich innych przypadkach można bezpiecznie sprawdzić, czy nie jest zdefiniowana z zachowaniem ścisłej równości:
źródło
Porównanie wielu różnych kontroli zerowych w JavaScript:
http://jsfiddle.net/aaronhoffman/DdRHB/5/
http://aaron-hoffman.blogspot.com/2013/04/javascript-null-checking-undefined-and.html
źródło
zarówno null, jak i undefined są równe false dla równości wartości (null == undefined): oba zwinięte są w wartość logiczną false. Nie są tym samym obiektem (null! == undefined).
undefined jest właściwością obiektu globalnego („okna” w przeglądarkach), ale jest typem pierwotnym, a nie samym obiektem. Jest to wartość domyślna dla niezainicjowanych zmiennych i funkcji kończących się bez instrukcji return.
null jest instancją Object. wartość null jest używana dla metod DOM, które zwracają obiekty kolekcji w celu wskazania pustego wyniku, co zapewnia fałszywą wartość bez wskazywania błędu.
źródło
Niektóre szczegóły:
null i undefined to dwie różne wartości. Jeden reprezentuje brak wartości nazwy, a drugi reprezentuje brak nazwy.
Co dzieje się w
if
następujący sposób, wygląda następującoif( o )
:Wyrażenie w nawiasach o jest oceniane, a następnie
if
kopnięcia w wymuszaniu typu wartości wyrażenia w nawiasach - w naszym przypadkuo
.Falsy (które zostaną wymuszone na false) w JavaScript to: '', null, undefined, 0 i false .
źródło
Aby dodać do odpowiedzi Czym różni się od
undefined
inull
od JavaScript Definitive Guide 6th Edition, str. 41 na tej stronie :źródło
null
jest przedmiotem. Jego typ to zero.undefined
nie jest przedmiotem; jego typ jest niezdefiniowany.źródło
null
iundefined
są wartościami prymitywne -typeof null === 'object'
jest to błąd język, boObject(null) !== null
Poniższa funkcja pokazuje, dlaczego i jest w stanie ustalić różnicę:
Jeśli zadzwonisz
Dostajesz
Pierwsze
console.log(...)
próbuje uzyskaćmyProperty
odmyObj
natomiast nie jest jeszcze określona - tak to wróci „nieokreślone”. Po przypisaniu mu wartości null drugaconsole.log(...)
zwraca oczywiście „null”, ponieważmyProperty
istnieje, ale manull
przypisaną wartość .Aby móc sprawdzić tę różnicę, JavaScript ma
null
iundefined
: Chociażnull
jest - podobnie jak w innych językach obiekt,undefined
nie może być obiektem, ponieważ nie ma dostępnej instancji (nawetnull
instancji).źródło
Na przykład
window.someWeirdProperty
jest niezdefiniowany, więc"window.someWeirdProperty === null"
ocenia na false podczas"window.someWeirdProperty === undefined"
ocenia na prawdę.Ponadto checkif
if (!o)
nie jest taka sama jak sprawdzanieif (o == null)
dlao
byciafalse
.źródło
Inną zabawną rzeczą w przypadku wartości null w porównaniu do niezdefiniowanej jest to, że można ją zwiększać.
Jest to przydatne do ustawiania domyślnych wartości liczbowych liczników. Ile razy ustawiłeś zmienną na -1 w jej deklaracji?
źródło
W Javascript
null
nie jestobject
typem, jestprimitave
typem.Jaka jest różnica? Niezdefiniowany odnosi się do wskaźnika, który nie został ustawiony. Null odnosi się do wskaźnika zerowego, na przykład coś ręcznie ustawiło zmienną na typ
null
źródło
Spójrz na to:
źródło
Z „The Principles of Object-Oriented Javascript” autorstwa Nicholasa C. Zakasa
Zakas, Nicholas C. (2014-02-07). Zasady obiektowego JavaScript (lokalizacje Kindle 226-227). Brak prasy skrobiowej. Wersja Kindle.
To mówi:
Nieokreślona sprawa:
źródło
Najlepszym sposobem, aby pomyśleć o „null”, jest przypomnienie, jak podobna koncepcja jest używana w bazach danych, gdzie wskazuje, że pole nie zawiera „żadnej wartości”.
Jest to bardzo przydatna technika pisania programów, które są łatwiejsze do debugowania. Nieokreślona zmienna może być wynikiem błędu ... (skąd byś wiedział?) ... ale jeśli zmienna zawiera wartość „null”, wiesz, że „ktoś gdzieś w tym programie ustaw ją na „null.” „Dlatego sugeruję, aby gdy trzeba pozbyć się wartości zmiennej, nie„ usuwaj ”... ustaw ją na„ null ”. Stara wartość zostanie osierocona i wkrótce zostanie wyrzucona do kosza; nowa wartość to „nie ma żadnej wartości (teraz)”. W obu przypadkach stan zmiennej jest pewny: „oczywiście, celowo, udało się to”.
źródło
2. Nieokreślony jest typem, podczas gdy Null jest obiektem.
3. Javascript może sam zainicjować dowolną nieprzypisaną zmienną na niezdefiniowaną, ale nigdy nie może ustawić wartości zmiennej na null. Należy to zrobić programowo.
źródło