Jaki jest najlepszy sposób sprawdzenia, czy właściwość obiektu w JavaScript jest undefined
?
źródło
Jaki jest najlepszy sposób sprawdzenia, czy właściwość obiektu w JavaScript jest undefined
?
Typowym sposobem sprawdzenia, czy wartość właściwości jest wartością specjalną undefined
, jest:
if(o.myProperty === undefined) {
alert("myProperty value is the special value `undefined`");
}
Aby sprawdzić, czy obiekt tak naprawdę nie ma takiej właściwości, dlatego undefined
domyślnie wróci , gdy spróbujesz uzyskać do niego dostęp:
if(!o.hasOwnProperty('myProperty')) {
alert("myProperty does not exist");
}
Aby sprawdzić, czy wartość związana z identyfikatorem jest wartość specjalny undefined
, lub jeśli identyfikator nie został uznany. Uwaga: ta metoda jest jedynym sposobem odwoływania się do niezadeklarowanego (uwaga: różniącego się od posiadania wartości undefined
) identyfikatora bez wczesnego błędu:
if(typeof myVariable === 'undefined') {
alert('myVariable is either the special value `undefined`, or it has not been declared');
}
W wersjach JavaScript wcześniejszych niż ECMAScript 5 właściwość o nazwie „undefined” w obiekcie globalnym była zapisywalna, a zatem proste sprawdzenie foo === undefined
może zachowywać się nieoczekiwanie, jeśli zostanie przypadkowo przedefiniowane. W nowoczesnym JavaScript właściwość jest tylko do odczytu.
Jednak we współczesnym JavaScript JavaScript słowo „niezdefiniowany” nie jest słowem kluczowym, dlatego zmienne w funkcjach można nazwać „niezdefiniowanymi” i zasłaniać globalną właściwość.
Jeśli martwi Cię ten (mało prawdopodobny) przypadek krawędzi, możesz użyć operatora pustki, aby uzyskać undefined
samą wartość specjalną :
if(myVariable === void 0) {
alert("myVariable is the special value `undefined`");
}
obj !== undefined
teraz.undefined
Kiedyś można go było modyfikować, takundefined = 1234
jak w przypadku interesujących wyników. Ale po Ecmascript 5 nie można już zapisywać, więc możemy użyć prostszej wersji. codereadability.com/how-to-check-for-undefined-in-javascriptUważam, że istnieje wiele niepoprawnych odpowiedzi na ten temat. Wbrew powszechnemu przekonaniu „niezdefiniowany” nie jest jest słowem kluczowym w JavaScript i może mieć przypisaną wartość.
Poprawny kod
Najbardziej niezawodny sposób na wykonanie tego testu to:
To zawsze zwraca poprawny wynik, a nawet radzi sobie z sytuacją, w której
myVar
nie jest zadeklarowany.Kod zdegenerowany. NIE UŻYWAJ.
Dodatkowo
myVar === undefined
spowoduje błąd w sytuacji, gdy myVar nie jest zgłoszony.źródło
=== undefined
oszołomienia. Tak, możesz przypisać doundefined
, ale nie ma uzasadnionego powodu, aby to zrobić, i można przewidzieć, że może to spowodować uszkodzenie kodu. W C możesz#define true false
, aw Pythonie możesz przypisaćTrue
iFalse
, ale ludzie nie czują potrzeby projektowania swojego kodu w tych językach w taki sposób, aby zabezpieczyć się przed możliwością celowego sabotowania własnego środowiska w innym miejscu kodu . Dlaczegoundefined
warto tutaj przypisać nawet wartość?void 0
aby uzyskać wartość, któraundefined
wskazuje. Więc możesz to zrobićif (myVar === void 0)
.0
nie jest wyjątkowy, można dosłownie umieścić dowolny wyraz tam.undefined
. MDN: undefinedPomimo tego, że jest gorąco polecany przez wiele innych odpowiedzi tutaj,
typeof
jest złym wyborem . Nigdy nie należy go używać do sprawdzania, czy zmienne mają wartośćundefined
, ponieważ działa to jako łączone sprawdzenie wartościundefined
i tego, czy zmienna istnieje. W zdecydowanej większości przypadków wiesz, kiedy istnieje zmienna, itypeof
po prostu wprowadzasz możliwość cichej awarii, jeśli popełnisz literówkę w nazwie zmiennej lub w literale ciągu'undefined'
.Tak więc, chyba że wykonujesz wykrywanie
typeof module !== 'undefined'
funkcji² , gdzie nie ma pewności, czy dana nazwa będzie objęta zakresem (np. Sprawdzanie jako krok w kodzie specyficznym dla środowiska CommonJS),typeof
jest szkodliwym wyborem, gdy jest używana w zmiennej, a poprawną opcją jest aby bezpośrednio porównać wartość:Niektóre typowe nieporozumienia na ten temat obejmują:
że odczyt „niezainicjowanej” zmiennej (
var foo
) lub parametru (function bar(foo) { … }
zwanego asbar()
) zakończy się niepowodzeniem. To po prostu nieprawda - zmienne bez wyraźnej inicjalizacji i parametry, którym nie podano wartości, zawsze stają sięundefined
i zawsze mają zakres.które
undefined
można zastąpić. Jest o wiele więcej.undefined
nie jest słowem kluczowym w JavaScript. Zamiast tego jest to właściwość obiektu globalnego o wartości Niezdefiniowana. Jednak od wersji ES5 ta właściwość jest tylko do odczytu i nie można jej konfigurować . Żadna nowoczesna przeglądarka nie pozwoli na zmianęundefined
właściwości, a od 2017 r. Ma to miejsce od dłuższego czasu. Brak trybu ścisłego również nie wpływa naundefined
zachowanie - po prostu powoduje, że wyrażenia takie jak „undefined = 5
nic nie rób” zamiast rzucać. Ponieważ nie jest to słowo kluczowe, możesz zadeklarować zmienne o nazwieundefined
, a zmienne te można zmienić, tworząc ten kiedyś powszechny wzorzec:bardziej niebezpieczne niż używanie globalnego
undefined
. Jeśli musisz być zgodnyundefined
z ES3, zamień navoid 0
- nie uciekaj siętypeof
. (void
zawsze był jednoargumentowym operatorem, który ocenia wartość niezdefiniowaną dla dowolnego argumentu).Ponieważ zmienne działają na przeszkodzie, nadszedł czas, aby odpowiedzieć na rzeczywiste pytanie: właściwości obiektu. Nie ma powodu, aby kiedykolwiek używać
typeof
właściwości obiektu. Wcześniejszy wyjątek dotyczący wykrywania funkcji nie ma tutaj zastosowania -typeof
ma on tylko specjalne zachowanie względem zmiennych, a wyrażenia odwołujące się do właściwości obiektu nie są zmiennymi.To:
jest zawsze dokładnie równoważne z tym3:
i biorąc pod uwagę powyższą poradę, aby uniknąć mylenia czytelników co do tego, dlaczego używasz
typeof
, ponieważ najbardziej sensowne jest użycie===
do sprawdzenia równości, ponieważ można ją ponownie sprawdzić, sprawdzając wartość zmiennej później, i ponieważ jest to po prostu zwykłe wygląda lepiej, zawsze należy również użyć=== undefined
³ tutaj .Jeśli chodzi o właściwości obiektu, należy wziąć pod uwagę jeszcze to, czy naprawdę chcesz to sprawdzić
undefined
. Dana nazwa właściwości może być nieobecna na obiekcie (generując wartośćundefined
podczas odczytu), być obecna na samym obiekcie z wartościąundefined
, występować na prototypie obiektu z wartościąundefined
lub być obecna na dowolnym z tych, które nie mająundefined
wartości.'key' in obj
powie ci, czy klucz znajduje się gdzieś w łańcuchu prototypowym obiektu, iObject.prototype.hasOwnProperty.call(obj, 'key')
powie, czy jest bezpośrednio na obiekcie. Nie będę jednak szczegółowo omawiał odpowiedzi na temat prototypów i używania obiektów jako map z kluczem łańcuchowym, ponieważ ma to na celu przede wszystkim przeciwdziałanie wszelkim złym radom w innych odpowiedziach, niezależnie od możliwych interpretacji pierwotnego pytania. Czytaj dalejprototypy obiektów na MDN, aby uzyskać więcej!¹ niezwykły wybór przykładowej nazwy zmiennej? to jest naprawdę martwy kod z rozszerzenia NoScript dla Firefoksa.
² nie zakładaj jednak, że nie wiadomo, co jest w zasięgu, jest ogólnie w porządku. dodatkowa wrażliwość spowodowana nadużyciem zakresu dynamicznego: Projekt Zero 1225
³ ponownie przyjmuje środowisko ES5 + i
undefined
odnosi się doundefined
właściwości obiektu globalnego. zastąpićvoid 0
inaczej.źródło
undefined
, ukrywając domyślny. Który dla większości praktycznych celów ma taki sam efekt jak nadpisanie go.void 0
do porównania z nieokreślonym, ale znowu - to głupie i przesadne.typeof something === "undefined")
w kodzie.void 0
jest (raz) zarówno krótszy, jak i bezpieczniejszy! To zwycięstwo w mojej książce.W JavaScript jest null i jest niezdefiniowany . Mają różne znaczenia.
Marijn Haverbeke w swojej bezpłatnej książce online „ Eloquent JavaScript ” (moje podkreślenie):
Myślę, że najlepszym sposobem sprawdzenia, czy coś jest niezdefiniowane, byłoby:
Mam nadzieję że to pomoże!
Edycja: w odpowiedzi na edycję właściwości obiektu powinny działać w ten sam sposób.
źródło
undefined
jest tylko zmienną, którą użytkownik może przypisać ponownie: pisanieundefined = 'a';
spowoduje, że kod przestanie robić to, co myślisz. Korzystanietypeof
jest lepsze i działa również w przypadku zmiennych (nie tylko właściwości), które nie zostały zadeklarowane.Co to znaczy: „niezdefiniowana właściwość obiektu” ?
W rzeczywistości może to oznaczać dwie zupełnie różne rzeczy! Po pierwsze, może to oznaczać właściwość, która nigdy nie została zdefiniowana w obiekcie, a po drugie, może oznaczać właściwość o nieokreślonej wartości . Spójrzmy na ten kod:
Jest
o.a
niezdefiniowany? Tak! Jego wartość jest nieokreślona. Jesto.b
niezdefiniowany? Pewnie! W ogóle nie ma właściwości „b”! OK, zobacz teraz, jak zachowują się różne podejścia w obu sytuacjach:Możemy to wyraźnie zobaczyć
typeof obj.prop == 'undefined'
iobj.prop === undefined
są równoważne i nie rozróżniają tych różnych sytuacji. I'prop' in obj
może wykryć sytuację, w której właściwość nie została w ogóle zdefiniowana i nie zwraca uwagi na wartość właściwości, która może być niezdefiniowana.Co więc zrobić?
1) Chcesz wiedzieć, czy właściwość jest niezdefiniowana na podstawie pierwszego lub drugiego znaczenia (najbardziej typowa sytuacja).
2) Chcesz tylko wiedzieć, czy obiekt ma jakąś właściwość i nie przejmuj się jego wartością.
Uwagi:
x.a === undefined
lub totypeof x.a == 'undefined'
rośnie,ReferenceError: x is not defined
jeśli x nie jest zdefiniowane.undefined
jest zmienną globalną (tak więc faktycznie znajduje sięwindow.undefined
w przeglądarkach). Jest obsługiwany od ECMAScript 1st Edition, a od ECMAScript 5 jest tylko do odczytu . Dlatego we współczesnych przeglądarkach nie można tego zmienić na prawdziwe, ponieważ wielu autorów lubi nas straszyć, ale nadal dotyczy to starszych przeglądarek.Ostateczna walka:
obj.prop === undefined
vstypeof obj.prop == 'undefined'
Plusy
obj.prop === undefined
:undefined
Wady
obj.prop === undefined
:undefined
można zastąpić w starych przeglądarkachPlusy
typeof obj.prop == 'undefined'
:Wady
typeof obj.prop == 'undefined'
:'undefned'
( niepoprawnie napisane ) tutaj jest tylko ciągiem ciągłym, więc silnik JavaScript nie może ci pomóc, jeśli źle napisałeś tak jak przed chwilą.Aktualizacja (dla JavaScript po stronie serwera):
Node.js obsługuje zmienną globalną
undefined
jakoglobal.undefined
(można jej również używać bez prefiksu „globalnego”). Nie wiem o innych implementacjach JavaScript po stronie serwera.źródło
undefined
członkostwieglobal
. Również aniconsole.log(global);
niefor (var key in global) { ... }
jest niezdefiniowany jako członek globalny . Ale test jak'undefined' in global
pokazuje odwrotnie.[[Enumerable]]
to nieprawda :-)Minuses of typeof obj.prop == 'undefined'
to, można tego uniknąć, pisząc jakotypeof obj.prop == typeof undefined
. Daje to również bardzo ładną symetrię.obj.prop === undefined
.if ('foo' in o
)… twoja odpowiedź jest prawdziwa pierwsza poprawna odpowiedź tutaj. Prawie wszyscy inni po prostu odpowiadają na to zdanie.Problem sprowadza się do trzech przypadków:
undefined
.undefined
.To mówi nam coś, co uważam za ważne:
Istnieje różnica między niezdefiniowanym elementem a zdefiniowanym elementem o nieokreślonej wartości.
Ale niestety
typeof obj.foo
nie mówi nam, który z trzech przypadków mamy. Możemy jednak połączyć to z,"foo" in obj
aby rozróżnić przypadki.Warto zauważyć, że testy te są takie same dla
null
wpisówTwierdzę, że w niektórych przypadkach bardziej sensowne (i jest jaśniejsze) jest sprawdzenie, czy właściwość istnieje, niż sprawdzenie, czy jest ona niezdefiniowana, a jedynym przypadkiem, w którym ta kontrola będzie inna, jest przypadek 2, rzadki przypadek rzeczywisty wpis w obiekcie o nieokreślonej wartości.
Na przykład: Właśnie refaktoryzowałem pęk kodu, który zawierał kilka sprawdzeń, czy obiekt ma daną właściwość.
Co było wyraźniejsze, gdy napisano bez czeku na niezdefiniowane.
Ale jak już wspomniano, nie są one dokładnie takie same (ale są wystarczająco dobre dla moich potrzeb).
źródło
if (!("x" in blob)) {}
z nawiasami wokół, ponieważ! operator ma pierwszeństwo przed „w”. Mam nadzieję, że komuś pomoże.a = {b: undefined}
; wtedytypeof a.b === typeof a.c === 'undefined'
ale'b' in a
i!('c' in a)
.{ x : undefined }
lub przynajmniej dodanie go jako kolejnej alternatywy dla (2.) w tabeli - musiałem pomyśleć przez chwilę, aby zdać sobie sprawę, że punkt (2.) oceniaundefined
(chociaż wspominasz o tym później).To działało dla mnie, podczas gdy inni nie.
źródło
typeof (something == "undefined")
.(typeof something) === "undefined"
.Nie jestem pewien, gdzie pochodzenie korzystania
===
zetypeof
pochodzi, jak i konwencji widzę to stosowane w wielu bibliotekach, ale operator typeof zwraca ciągiem znaków, a wiemy, że góry, więc dlaczego chcesz także rodzaj też to sprawdzić?źródło
==
nadal wymaga co najmniej sprawdzenia typu - interpreter nie może porównać dwóch operandów, nie znając najpierw ich typu.==
jest o jedną postać mniej niż===
:)Przeniesienie odpowiedzi z powiązanego pytania Jak sprawdzić, czy w JavaScript jest „niezdefiniowany”?
Specyficzne dla tego pytania, patrz przypadki testowe z
someObject.<whatever>
.Niektóre scenariusze ilustrujące wyniki różnych odpowiedzi: http://jsfiddle.net/drzaus/UVjM4/
(Należy pamiętać, że użycie
var
doin
testów robi różnicę, gdy znajduje się w opakowaniu z lunetą)Kod referencyjny:
I wyniki:
źródło
Jeśli zrobisz
zakończy się niepowodzeniem, gdy zmienna
myvar
nie istnieje, ponieważ myvar nie jest zdefiniowany, więc skrypt jest zepsuty, a test nie ma wpływu.Ponieważ obiekt okna ma zasięg globalny (obiekt domyślny) poza funkcją, deklaracja zostanie „dołączona” do obiektu okna.
Na przykład:
Zmienna globalna myvar jest taka sama jak window.myvar lub window ['myvar']
Aby uniknąć błędów w testowaniu, gdy istnieje zmienna globalna, lepiej użyć:
Pytanie, czy zmienna naprawdę istnieje, nie ma znaczenia, jej wartość jest niepoprawna. W przeciwnym razie głupio jest inicjalizować zmienne z niezdefiniowanym i lepiej jest użyć wartości false do inicjalizacji. Kiedy wiesz, że wszystkie deklarowane przez ciebie zmienne są inicjalizowane wartością false, możesz po prostu sprawdzić jego typ lub polegać na
!window.myvar
sprawdzeniu, czy ma on prawidłową / prawidłową wartość. Nawet jeśli zmienna nie jest zdefiniowana, to!window.myvar
jest taka sama dlamyvar = undefined
lubmyvar = false
lubmyvar = 0
.Gdy oczekujesz określonego typu, sprawdź typ zmiennej. Aby przyspieszyć testowanie stanu, lepiej:
Gdy pierwszy i prosty warunek jest spełniony, tłumacz pomija kolejne testy.
Zawsze lepiej jest użyć instancji / obiektu zmiennej, aby sprawdzić, czy uzyskała prawidłową wartość. Jest bardziej stabilny i stanowi lepszy sposób programowania.
(y)
źródło
Nie widziałem (mam nadzieję, że nie tęskniłem) nikogo sprawdzającego obiekt przed nieruchomością. Jest to więc najkrótszy i najskuteczniejszy (choć niekoniecznie najbardziej wyraźny):
Jeśli obiekt obj lub obj.prop jest niezdefiniowany, null lub „falsy”, instrukcja if nie wykona bloku kodu. Jest to zwykle pożądane zachowanie w większości instrukcji bloków kodu (w JavaScript).
źródło
var x = obj && obj.prop || 'default';
W artykule Exploring the Abyss of Null and Undefined in JavaScript przeczytałem, że frameworki takie jak Underscore.js używają tej funkcji:
źródło
void 0
to tylko krótki sposób pisaniaundefined
(ponieważ to właśnie pustka, po której następuje zwrot wyrażenia), oszczędza 3 znaki. Mógłby to zrobićvar a; return obj === a;
, ale to jeszcze jedna postać. :-)void
jest słowem zastrzeżonym, podczas gdyundefined
nie jest, tzn. gdy domyślnieundefined
jest równevoid 0
, możesz przypisać wartośćundefined
npundefined = 1234
.isUndefined(obj)
: 16 znaków.obj === void 0
: 14 znaków. - powiedział mniej więcej.Po prostu wszystko nie jest zdefiniowane w JavaScript, jest niezdefiniowane , nie ma znaczenia, czy jest to właściwość wewnątrz Object / Array, czy tylko zwykła zmienna ...
JavaScript ma,
typeof
dzięki czemu bardzo łatwo jest wykryć niezdefiniowaną zmienną.Wystarczy sprawdzić, czy
typeof whatever === 'undefined'
i zwróci wartość logiczną.Tak
isUndefined()
napisano słynną funkcję w AngularJs v.1x:Gdy zobaczysz, że funkcja odbiera wartość, jeśli ta wartość jest zdefiniowana, zwróci
false
, w przeciwnym razie zwróci wartość dla niezdefiniowanych wartościtrue
.Spójrzmy więc, jakie będą wyniki, gdy przekażemy wartości, w tym właściwości obiektu jak poniżej, oto lista zmiennych, które mamy:
i sprawdzamy je jak poniżej, możesz zobaczyć wyniki przed nimi jako komentarz:
Jak widzisz, możemy sprawdzić wszystko za pomocą czegoś takiego w naszym kodzie, jak wspomniano, możesz po prostu użyć
typeof
w kodzie, ale jeśli używasz go w kółko, utwórz funkcję podobną do próbki kątowej, którą udostępniam i nadal używam jako zgodnie ze wzorem kodu DRY.I jeszcze jedno, aby sprawdzić właściwość obiektu w prawdziwej aplikacji, której nie jesteś pewien, czy nawet obiekt istnieje, sprawdź, czy obiekt istnieje wcześniej.
Jeśli zaznaczysz właściwość obiektu, a obiekt nie istnieje, zgłosi błąd i zatrzyma działanie całej aplikacji.
Tak proste, że możesz zawinąć w instrukcję if, taką jak poniżej:
Co również równe jest Zdefiniowane w Angular 1.x ...
Również inne frameworki javascript, takie jak podkreślenie, mają podobną kontrolę definiującą, ale zalecam użycie,
typeof
jeśli już nie używasz żadnych frameworków.Dodałem również tę sekcję z MDN, która zawiera przydatne informacje na temat typeof, undefined i void (0).
więcej> tutaj
źródło
„ if (window.x) {} ” jest bezpieczny pod względem błędów
Najprawdopodobniej chcesz
if (window.x)
. Ta kontrola jest bezpieczna, nawet jeśli x nie został zadeklarowany (var x;
) - przeglądarka nie zgłasza błędu.Przykład: Chcę wiedzieć, czy moja przeglądarka obsługuje History API
Jak to działa:
window jest obiektem, który przechowuje wszystkie zmienne globalne jako swoje elementy, a próba uzyskania dostępu do nieistniejącego elementu jest legalna. Jeśli x nie zostało zadeklarowane lub nie zostało ustawione, wówczas
window.x
zwraca niezdefiniowane . niezdefiniowana prowadzi do fałszu, gdy if () ją ocenia.źródło
typeof history != 'undefined'
faktycznie działa w obu systemach.Czytając to, jestem zdumiony, że tego nie widziałem. Znalazłem wiele algorytmów, które by do tego pasowały.
Nigdy nie zdefiniowano
Jeśli wartość obiektu nigdy nie została zdefiniowana, uniemożliwi to powrót,
true
jeśli zostanie zdefiniowana jakonull
lubundefined
. Jest to pomocne, jeśli chcesz zwrócić wartość true dla wartości ustawionych jakoundefined
Zdefiniowane jako niezdefiniowane lub nigdy nie zdefiniowane
Jeśli chcesz, aby wynik był taki jak
true
dla wartości zdefiniowanych wartościąundefined
lub nigdy nie został zdefiniowany, możesz po prostu użyć=== undefined
Zdefiniowane jako wartość fałszowania, niezdefiniowane, zerowe lub nigdy nie zdefiniowane.
Często ludzie pytają mnie o algorytm, aby dowiedzieć się, czy wartość jest fałszem
undefined
, lubnull
. Następujące prace.źródło
if (!obj.prop)
var obj = {foo: undefined}; obj.foo === void 0
->true
. Jak to się „nigdy nie definiuje jakoundefined
”? To jest źle.źródło
Porównaj z
void 0
, dla zwięzłości.To nie jest tak gadatliwe jak
if (typeof foo !== 'undefined')
źródło
foo
zostanie zgłoszony.Rozwiązanie jest nieprawidłowe. W JavaScript
zwróci wartość true, ponieważ oba są „rzutowane” na wartość logiczną i są fałszywe. Prawidłowym sposobem byłoby sprawdzenie
który jest operatorem tożsamości ...
źródło
===
to równość typu + (pierwotna równość | tożsamość obiektu), gdzie pierwotne obejmują łańcuchy. Myślę, że większość ludzi uważa za'abab'.slice(0,2) === 'abab'.slice(2)
nieintuicyjne, jeśli ktoś uważa się===
za operatora tożsamości.Możesz uzyskać tablicę ze wszystkimi niezdefiniowanymi ścieżkami, używając następującego kodu.
Link do jsFiddle
źródło
getUndefiend
powinno byćgetUndefined
.Oto moja sytuacja:
Korzystam z wyniku wywołania REST. Wynik należy przeanalizować z JSON do obiektu JavaScript.
Jest jeden błąd, którego muszę bronić. Jeśli argumenty wywołania reszty były niepoprawne, o ile użytkownik podał błędne argumenty, wywołanie reszty wraca w zasadzie puste.
Korzystając z tego postu, aby pomóc mi się przed tym bronić, próbowałem tego.
W mojej sytuacji, jeśli restResult.data [0] === "obiekt", to mogę bezpiecznie rozpocząć sprawdzanie reszty elementów. Jeśli nie jest zdefiniowany, wyrzuć błąd jak wyżej.
Mówię tylko, że w mojej sytuacji wszystkie powyższe sugestie nie zadziałały. Nie mówię, że mam rację i wszyscy się mylą. W ogóle nie jestem mistrzem JavaScript, ale mam nadzieję, że to komuś pomoże.
źródło
typeof
strażnik tak naprawdę nie chroni przed niczym, z czym nie poradziłoby sobie bezpośrednie porównanie. JeślirestResult
jest niezdefiniowany lub niezadeklarowany, nadal będzie rzucał.if(!restResult.data.length) { throw "Some error"; }
Istnieje przyjemny i elegancki sposób przypisania zdefiniowanej właściwości do nowej zmiennej, jeśli jest ona zdefiniowana, lub przypisania jej wartości domyślnej jako rezerwowej, jeśli jest niezdefiniowana.
Jest odpowiedni, jeśli masz funkcję, która otrzymuje dodatkową właściwość config:
Teraz wykonywana
źródło
Wszystkie odpowiedzi są niekompletne. To jest właściwy sposób, aby wiedzieć, że istnieje właściwość „zdefiniowana jako niezdefiniowana”:
Przykład:
Szkoda, że to była prawidłowa odpowiedź zakopana w złych odpowiedziach> _ <
Dla każdego, kto przejedzie, dam ci niezdefiniowane za darmo !!
źródło
Przeglądając komentarze, dla tych, którzy chcą sprawdzić oba, jest niezdefiniowana lub jej wartość jest null:
Jeśli używasz biblioteki jQuery
jQuery.isEmptyObject()
, wystarczy w obu przypadkach,źródło
Jeśli używasz Angulara:
Underscore.js:
źródło
1
do zmiennejx
? Czy potrzebuję podkreślenia lub jQuery? (niesamowite, że ludzie będą używać bibliotek do nawet najbardziej podstawowych operacji, takich jaktypeof
czek)Używam
if (this.variable)
do testowania, czy to jest zdefiniowane. Prosteif (variable)
, zalecane powyżej , zawodzi dla mnie. Okazuje się, że działa tylko wtedy, gdy zmienna jest polem jakiegoś obiektu,obj.someField
aby sprawdzić, czy jest zdefiniowana w słowniku. Ale możemy użyćthis
lubwindow
jako obiektu słownika, ponieważ jakakolwiek zmienna jest polem w bieżącym oknie, tak jak ja to rozumiem. Dlatego tutaj jest testNajpierw wykrywa, że zmienna
abc
jest niezdefiniowana i jest definiowana po inicjalizacji.źródło
Podaję tutaj trzy sposoby dla tych, którzy oczekują dziwnych odpowiedzi:
isUndefined1:
Spróbuj uzyskać właściwość wartości wejściowej, sprawdź komunikat o błędzie, jeśli istnieje. Jeśli wartość wejściowa jest niezdefiniowana, komunikat o błędzie brzmiałby: Nieprzechwycony typ błędu : Nie można odczytać właściwości „b” niezdefiniowanej
isUndefined2:
Konwertuj wartość wejściową na ciąg znaków, aby porównać
"undefined"
i upewnij się, że jest to wartość ujemna.isUndefined3:
W js parametr opcjonalny działa, gdy wartość wejściowa jest dokładnie
undefined
.źródło
Zwraca false, jeśli zmienna jest ustawiona, a true, jeśli jest niezdefiniowana.
Następnie użyj:
źródło
typeof
testu w funkcji. Niesamowite, że 4 osoby głosowały za tym. -1.Chciałbym pokazać ci coś, czego używam w celu ochrony
undefined
zmiennej:To zabrania nikomu zmiany
window.undefined
wartości, a tym samym niszczenia kodu na podstawie tej zmiennej. Jeśli używasz"use strict"
, wszystko, co próbuje zmienić jego wartość, zakończy się błędem, w przeciwnym razie zostanie po cichu zignorowane.źródło
możesz także użyć proxy, będzie działać z zagnieżdżonymi wywołaniami, ale będzie wymagał jednego dodatkowego sprawdzenia:
więc użyjesz go jak:
źródło
Z lodash.js.
Tworzy zmienną LOCAL o nazwie,
undefined
która jest inicjowana wartością domyślną - rzeczywistąundefined
, a następnie porównywanavalue
ze zmiennąundefined
.Aktualizacja 9.09.2019
Odkryłem, że lodash zaktualizował jego wdrożenie. Zobacz mój problem i kod .
Aby być kuloodpornym, po prostu użyj:
źródło