Która metoda sprawdzania, czy zmienna została zainicjowana, jest lepsza / poprawna? (Zakładając, że zmienna może pomieścić wszystko (łańcuch, int, obiekt, funkcja itp.))
if (elem) { // or !elem
lub
if (typeof(elem) !== 'undefined') {
lub
if (elem != null) {
javascript
variables
initialization
undefined
Samuel Liew
źródło
źródło
foo
jest zadeklarowany, albotypeof foo === 'undefined'
albotypeof foo === typeof undefined
undefined
. Prawidłowa odpowiedź to: stackoverflow.com/a/36432729/772035hasOwnProperty('bar')
nie mają te same braki, jak inni, ale wymaga pewnych korekt dla węzła (wymienićwindow
zglobal
).Odpowiedzi:
Chcesz się z
typeof
operatorem . Konkretnie:źródło
typeof
Operator sprawdzi, czy zmienna jest naprawdę niezdefiniowane.typeof
Operator, w przeciwieństwie do innych operatorów, nie rzucać ReferenceError wyjątku w przypadku korzystania z zmiennej nierejestrowanej.Pamiętaj jednak, że
typeof null
wróci"object"
. Musimy uważać, aby uniknąć błędu inicjalizacji zmiennejnull
. Aby być bezpiecznym, możemy zamiast tego użyć:Aby uzyskać więcej informacji na temat używania ścisłego porównania
===
zamiast prostej równości==
, zobacz:Który operator równości (== vs ===) powinien być używany w porównaniach JavaScript?
źródło
if(! variable_here)
pęknie w wielu przypadkach. Jeśli zmienna ma wartość 0 lub false, nie powiedzie się. Nie tego chcesz.typeof foo === "undefined"
jest poprawna i lepsza niż najlepsza głosowana odpowiedź, ale dodatkowe uwagi tylko niejasną.W wielu przypadkach użycie:
zrobi to za Ciebie! ... sprawdzi następujące poniższe przypadki:
undefined
''
Będzie więc obejmował wszystkie przypadki, ale zawsze są dziwne przypadki, które chcielibyśmy również uwzględnić, na przykład ciąg znaków ze spacjami, taki jak ten
' '
, zostanie zdefiniowany w javascript, ponieważ ma spacje wewnątrz ciągu ... na przykład w tym przypadku dodajesz jeszcze jedną kontrolę za pomocą trim (), na przykład:Ponadto te kontrole dotyczą tylko wartości , ponieważ obiekty i tablice działają inaczej w JavaScript, pusta tablica
[]
i pusty obiekt{}
są zawsze prawdziwe .Tworzę obraz poniżej, aby pokazać krótki skrót odpowiedzi:
źródło
if(elem)
sprawdza , czy nie jest zdefiniowany (chociaż zwraca nieokreślony błąd), prawda?W JavaScript można zdefiniować zmienną, ale zachować tę wartość
undefined
, więc najczęstsza odpowiedź nie jest technicznie poprawna i zamiast tego wykonuje następujące czynności:To może wystarczyć do twoich celów. Poniższy test ma prostszą semantykę, co ułatwia precyzyjne opisanie zachowania twojego kodu i zrozumienie go samemu (jeśli zależy Ci na takich rzeczach):
To oczywiście zakłada, że działasz w przeglądarce (gdzie
window
jest nazwa obiektu globalnego). Ale jeśli bawisz się takimi globalami, prawdopodobnie jesteś w przeglądarce. Subiektywnie używanie'name' in window
jest stylistycznie spójne z używaniemwindow.name
w odniesieniu do globali. Dostęp do globałów jako właściwościwindow
zmiennych zamiast jako zmiennych pozwala zminimalizować liczbę niezadeklarowanych zmiennych, do których się odwołujesz w kodzie (na korzyść puchnięcia), i pozwala uniknąć cieniowania globalnej zmiennej lokalnej. Ponadto, jeśli globale powodują, że skóra się czołga, możesz czuć się bardziej komfortowo dotykając ich tylko tym stosunkowo długim kijem.źródło
W większości przypadków użyłbyś:
W przeciwieństwie do proste
if (elem)
, umożliwia0
,false
,NaN
i''
, lecz odrzucanull
lubundefined
, co bardzo dobry, ogólny test na obecność argument lub właściwości obiektu.Inne kontrole również nie są niepoprawne, mają tylko różne zastosowania:
if (elem)
: Mogą być stosowane, jeżelielem
jest gwarancją obiektu, lub jeślifalse
,0
itd są uważane za wartości „domyślne” (stąd równoważneundefined
lubnull
).typeof elem == 'undefined'
może być stosowany w przypadkach, gdy określonynull
ma odrębne znaczenie dla niezainicjowanej zmiennej lub właściwości.elem
nie zostanie zadeklarowana (tj. Brakvar
instrukcji, brak właściwościwindow
lub argument funkcji). Jest to, moim zdaniem, dość niebezpieczne, ponieważ pozwala na pomijanie literówek. Aby tego uniknąć, zobacz poniższą metodę.Przydatne jest również ścisłe porównanie z
undefined
:Ponieważ jednak globalny
undefined
można zastąpić inną wartością,undefined
przed użyciem należy zadeklarować zmienną w bieżącym zakresie:Lub:
Druga zaleta tej metody polega na tym, że minizatory JS mogą zredukować
undefined
zmienną do jednego znaku, oszczędzając za każdym razem kilka bajtów.źródło
undefined
. Nie sądzę, że warto o tym wspomnieć w odpowiedzi. Prawdopodobnie najgorsza akceptowalna nazwa zmiennej w całym Javascript.window.
przed zmienną, jeśli jest używana w kontekście globalnym ... nie jest to najlepszy sposób.void(0)
zamiastundefined
.false
,0
itp jako nieprawidłowych wartości.Sprawdź, czy
window
.hasOwnProperty
( „varname
” )Alternatywa dla mnóstwa
typeof
odpowiedzi;Zmienne globalne zadeklarowane za pomocą
var varname = value;
instrukcji w zakresie globalnymJako taka
hasOwnProperty()
metoda, któraa
var
nazwy „varname” zostało zadeklarowane globalnie, tj. jest własnościąwindow
.Wspaniałe
hasOwnProperty()
jest to, że nazywając go, nie używamy zmiennej, która może być jeszcze niezadeklarowana - co oczywiście stanowi połowę problemu.Chociaż nie zawsze jest to idealne lub idealne rozwiązanie, w pewnych okolicznościach jest to po prostu praca!
Notatki
Powyższe jest prawdziwe w przypadku używania
var
do definiowania zmiennej , w przeciwieństwie dolet
:Dla kompletności:
const
stałe z definicji nie są w rzeczywistości zmienne (chociaż ich treść może być); bardziej odpowiednio:Ponieważ
let
zmienne lubconst
stałe nigdy nie są właściwościami żadnego obiektu, który odziedziczyłhasOwnProperty()
metodę, nie można go użyć do sprawdzenia ich istnienia.W odniesieniu do dostępności i wykorzystania
hasOwnProperty()
:źródło
true
(np.window.hasOwnProperty('console')
Lubvar hop = "p";window.hasOwnProperty('hop')
).typeof
odpowiedzi po prostu przeoczają.let
których zmienne te nie są dostępne jako właściwościwindow
[lub innego dostępnego] obiektu.hasOwnProperty
testy na obecność właściwości , a nie zmiennych, a zatem nie mogą być używane do wykrywania zmiennych zdefiniowanych przezlet
.var
i jest w tym względzie nieaktualna. Dodałem jednak notatkę opisującą, w jaki sposób użycielet
iconst
różni się odvar
. Dzięki za inspirację; razem powstajemy :)hasOwnProperty
można jej użyć tylko w określony sposób, aby sprawdzić istnienievar
zmiennych. Dla mnie to brzmi dobrze.Jak sprawdzić, czy zmienna istnieje
Jest to dość kuloodporne rozwiązanie do testowania, czy zmienna istnieje i została zainicjowana:
Najczęściej jest używany w połączeniu z operatorem trójskładnikowym, aby ustawić wartość domyślną w przypadku, gdy pewna zmienna nie została zainicjowana:
Problemy z enkapsulacją
Niestety nie można po prostu zawrzeć czeku w funkcji.
Możesz pomyśleć o zrobieniu czegoś takiego:
To jednak spowoduje błąd odniesienia, jeśli dzwonisz np.
isset(foo)
i zmiennafoo
nie została zdefiniowana, ponieważ nie można przekazać nieistniejącej zmiennej do funkcji:Testowanie, czy parametry funkcji są niezdefiniowane
Chociaż nasza
isset
funkcja nie może być używana do testowania, czy zmienna istnieje, czy nie (z powodów wyjaśnionych powyżej), pozwala nam przetestować, czy parametry funkcji są niezdefiniowane:Mimo że
y
do funkcji nie jest przekazywana żadna wartośćtest
, naszaisset
funkcja działa idealnie w tym kontekście, ponieważy
jest znana w funkcjitest
jakoundefined
wartość.źródło
Istnieje inny krótki sposób sprawdzenia tego, gdy wykonujesz proste zadania i powiązane kontrole. Wystarczy użyć operatora warunkowego (trójskładnikowego).
Będzie to również pomocne, gdy spróbujesz zadeklarować zmienną globalną przy pomocy instancji zmiennej referencyjnej.
Jeśli chcesz sprawdzić zmienną nie powinna być
undefined
lubnull
. Następnie wykonaj poniższe sprawdzenie.Gdy zmienna jest zadeklarowana, a jeśli chcesz sprawdzić wartość, jest to nawet proste: wykona się
undefined
inull
sprawdzi razem.źródło
typeof(booooo)
jest"undefined"
wtedytypeof(typeof boooooo)
jest"string"
itypeof boooooo && true
jest zawszetrue
. Odpowiedź Johna-Slegersa jest tak skrócona, jak to tylko możliwe w przypadku typeof.If you wanted to check variable shouldn't be undefined or null.
: Przez ten komentarz, wyraźnie stwierdzający, że nie należy przeprowadzać sprawdzania deklaracji zmiennych. to jest sprawdzenie wartości zmiennej.Krótki sposób testowania zmiennej nie jest zadeklarowany (nie jest niezdefiniowany)
Uznałem, że jest to przydatne do wykrywania skryptu działającego poza przeglądarką (bez deklarowania
window
zmiennej).źródło
window.bar=undefined
jest zdefiniowany i ustawiony na wartość. Twoja odpowiedź nie wykrywa różnicy między tym a tym, jeśli zmienna nie istnieje. Gdybyś to zrobiłthis.hasOwnProperty('bar')
, mogłoby to zadziałać.const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();
. Zmiennax
jest zdefiniowana, ale zwracana jest wartość false ...To zależy, czy zależy ci tylko na tym, aby zmienna została zdefiniowana, czy na wartości, która ma mieć znaczenie.
Sprawdzenie, czy typ jest niezdefiniowany, sprawdzi, czy zmienna została jeszcze zdefiniowana.
=== null
lub!== null
sprawdzi tylko, czy wartość zmiennej jest dokładnienull
.== null
lub!= null
sprawdzi, czy wartość wynosiundefined
lubnull
.if(value)
sprawdzi, czy zmienna jestundefined
,null
,0
lub pusty ciąg.źródło
Najwyższa odpowiedź jest poprawna, użyj typeof.
Chciałem jednak zauważyć, że w JavaScript
undefined
można modyfikować (z jakiegoś bezbożnego powodu). Więc po prostu sprawdzenie, czyvarName !== undefined
nie, może nie zawsze powrócić tak, jak tego oczekujesz, ponieważ inne biblioteki lib mogły ulec zmianie niezdefiniowane. Kilka odpowiedzi (na przykład @ Skalee'a) wydaje się, że wolą nie używaćtypeof
, a to może sprawić kłopoty.„Starym” sposobem radzenia sobie z tym było zadeklarowanie niezdefiniowanego jako var, aby zrównoważyć wszelkie potencjalne wyciszenie / przekroczenie
undefined
. Jednak najlepszym sposobem jest nadal używanie,typeof
ponieważ zignoruje wszelkie zastąpienieundefined
z innego kodu. Zwłaszcza jeśli piszesz kod do wykorzystania na wolności, gdzie kto wie, co jeszcze może być uruchomione na stronie ...źródło
varName !== undefined
, spowoduje to błąd ReferenceError. Zmiennośćundefined
nie będzie miała znaczenia.undefined
jest właściwością tylko do odczytu. Jednak aby być kuloodpornym, możesz użyćtypeof mvVar === typeof void 0
. zawszevoid 0
wracaundefined
.Albo lepiej
Działa we wszystkich przeglądarkach
źródło
Aby wziąć udział w debacie, jeśli wiem, że zmienna powinna być łańcuchem lub obiektem, zawsze wolę
if (!variable)
, więc sprawdzam, czy jest to fałsz. Może to doprowadzić do czystszego kodu, dzięki czemu na przykład:.. można zmniejszyć do:
źródło
''
twojemu rozwiązaniu, uznałoby to za niezdefiniowane, gdy w rzeczywistości jest zdefiniowane jako zawierające pusty ciąg.Trudno rozróżnić niezdefiniowane od zerowego. Null to wartość, którą można przypisać do zmiennej, jeśli chcesz wskazać, że zmienna nie ma określonej wartości. Niezdefiniowana to specjalna wartość, która będzie domyślną wartością nieprzypisanych zmiennych.
źródło
Null jest wartością w JavaScript i
typeof null
zwraca"object"
Dlatego zaakceptowana odpowiedź nie zadziała, jeśli przekażesz wartości null. Jeśli przekażesz wartości null, musisz dodać dodatkowe sprawdzenie wartości null:
źródło
Najbardziej niezawodna kontrola „jak to zdefiniowano” dotyczy typu typeof
Jeśli po prostu sprawdzasz zdefiniowaną zmienną do przypisania wartości domyślnej, dla łatwego do odczytania jednego linijki często możesz to zrobić:
Często jest dobrze używać, patrz: Idiomatyczny sposób ustawiania wartości domyślnej w javascript
Istnieje również jedna linijka wykorzystująca słowo kluczowe typeof :
źródło
możesz użyć
typeof
operatora.Na przykład,
Fragment powyższego kodu zwróci wynik jak
źródło
Aby sprawdzić, czy zmienna została zadeklarowana / ustawiona, zrobiłem tę brudną sztuczkę.
Nie znalazłem sposobu na wyodrębnienie kodu do funkcji, nawet przy pomocy
eval
.źródło
Te odpowiedzi (oprócz rozwiązania Freda Gandta) są niepoprawne lub niekompletne.
Załóżmy, że muszę
variableName;
miećundefined
wartość, a zatem została zadeklarowana w taki sposób, żevar variableName;
oznacza to, że została już zainicjowana ; - Jak sprawdzić, czy jest już zadeklarowany?Albo jeszcze lepiej - jak od razu sprawdzić, czy „Book1.chapter22.paragraph37” istnieje przy jednym wywołaniu, ale nie zgłosić błędu odniesienia?
Robimy to za pomocą najbardziej wydajnego operatora JasvaScript, operatora in . :
W czasach szczytowej popularności AJAX napisałem metodę (później nazwaną) isNS (), która jest w stanie określić, czy przestrzeń nazw istnieje, w tym szczegółowe testy nazw właściwości, takie jak „Book1.chapter22.paragraph37” i wiele innych.
Ale ponieważ został wcześniej opublikowany i ze względu na jego ogromne znaczenie zasługuje na opublikowanie w osobnym wątku, nie opublikuję go tutaj, ale podam słowa kluczowe ( javascript + isNS ), które pomogą Ci zlokalizować kod źródłowy, poparty wszystkimi niezbędne wyjaśnienia.
źródło
in
Operator sprawdza tylko istnienia właściwości, a nie wszystkie zmienne właściwości -const
ilet
zgłoszeń nie są (iconst
nie są jeszcze dobrze, zmienne ).const
ilet
zostały znormalizowane za pomocą ECMAScript 2015, który został opublikowany ponad 3 lata temu i od tego czasu spotkał się z dobrym przyjęciem przez zwykłych podejrzanych i jest dziś dość rozpowszechniony, ośmielę się powiedzieć - w Github występuje ponad 2 miliony wystąpień „const” w plikach JS .in
operatora do ogólnego sprawdzenia, czy zmienna istnieje, ponieważ „const i let are not [properties]” - chociażconst
można powiedzieć, że wprowadza stałe odwołanie, ponieważ z drugiej strony, w przeciwieństwie do odniesienia do zmiennej ,let
faktycznie wprowadza odwołanie do zmiennej - innymi słowy, jest to zmienna, a twoja odpowiedź jest nieprawidłowa, co oznacza, że możesz przetestować, czy zmienna zdefiniowana za pomocąlet
istnieje za pomocąin
operatora - nie możesz.window
obiektu, nie wiem, jak to dla ciebie wyjaśnić.let
słowa kluczowego. To wszystko, na co zwróciłem uwagę.W szczególnej sytuacji opisanej w pytaniu
jest identyczny z
Wolę ten drugi, ponieważ jest krótszy.
Pamiętaj, że szukamy
console
tylko w zakresie globalnym (który jestwindow
obiektem we wszystkich przeglądarkach). W tej konkretnej sytuacji jest to pożądane. Nie chcemyconsole
definiować gdzie indziej.@BrianKelley w swojej świetnej odpowiedzi wyjaśnia szczegóły techniczne. Dodałem tylko brak wniosków i przetrawiłem to w coś łatwiejszego do odczytania.
źródło
Używam dwóch różnych sposobów w zależności od obiektu.
Czasami nie chcę oceniać pustego ciągu jako falsey, więc używam tego przypadku
Jeśli potrzebujesz czegoś przeciwnego, to w pierwszej kolejności zmienna staje się zmienną !!, aw nieprawidłowej funkcji === staje się! =, A nazwy funkcji zmieniają się na notInvalid.
źródło
Moje preferencje to
typeof(elem) != 'undefined' && elem != null
.Niezależnie od tego, co wybierzesz, zastanów się nad umieszczeniem czeku w takiej funkcji
Jeśli nie wiesz, że zmienna została zadeklarowana, kontynuuj od
typeof (x) != 'undefined' && x != null;
Jeśli wiesz, że zmienna jest zadeklarowana, ale może nie istnieć, możesz użyć
Sprawdzana zmienna może czasami być zagnieżdżoną właściwością. Możesz użyć prop || {}, aby przejść dalej, sprawdzając istnienie danej nieruchomości:
Po każdej właściwości użyj (... '|| {}'). NextProp, aby brakująca właściwość nie generowała błędu.
Lub możesz użyć egy like
existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)
źródło
typeof (x) != 'undefined' && x != null
jest równoważne zx != null
momentemx
zadeklarowania.To zależy od sytuacji. Jeśli szukasz czegoś, co mogło lub nie zostało zdefiniowane globalnie poza twoim kodem (na przykład jQuery), chcesz:
(Nie ma potrzeby ścisłej równości, typeof zawsze zwraca ciąg znaków.) Ale jeśli masz argumenty funkcji, które mogły lub nie zostały przekazane, zawsze będą zdefiniowane, ale zerowe, jeśli zostaną pominięte.
źródło
Próbuj złapać
Jeśli zmienna w ogóle nie została zdefiniowana, możesz to sprawdzić bez wykonania kodu przerwania za pomocą bloku try-catch w następujący sposób (nie musisz
use strict
włączać trybu)Pokaż fragment kodu
BONUS: (odnosząc się do innych odpowiedzi) Dlaczego
===
jest bardziej jasne niż==
( źródło )jeśli (a == b)
jeśli (a === b)
źródło
Dziwię się, że nie wspomniano o tym jeszcze ...
oto kilka dodatkowych wariantów użycia
this['var_name']
zaletą tej metody jest to, że można jej użyć przed zdefiniowaniem zmiennej.
źródło
window.bar=undefined
jest zdefiniowany i ustawiony na wartość. Twoja odpowiedź nie wykrywa różnicy między tym a tym, jeśli zmienna nie istnieje. Gdybyś to zrobiłthis.hasOwnProperty('bar')
, mogłoby to zadziałać.