W PHP możesz to zrobić if(isset($array['foo'])) { ... }
. W JavaScript często if(array.foo) { ... }
robisz to samo, ale nie jest to dokładnie to samo zdanie. Warunek oceni również na false, jeśli array.foo
istnieje, ale jest false
lub 0
(i prawdopodobnie również inne wartości).
Jaki jest idealny odpowiednik PHP isset
w JavaScript?
W szerszym sensie wygodny byłby ogólny, kompletny przewodnik po JavaScript w obsłudze zmiennych, które nie istnieją, zmiennych bez wartości itp.
javascript
isset
Bart van Heukelom
źródło
źródło
_.isUndefined(arr.foo)
Odpowiedzi:
Ogólnie używam
typeof
operatora:Zwróci
"undefined"
albo, jeśli właściwość nie istnieje, albo jej wartość toundefined
.(Zobacz także: Różnica między
undefined
brakiem zdefiniowania ).Istnieją inne sposoby ustalenia, czy właściwość istnieje na obiekcie, takie jak
hasOwnProperty
metoda:A
in
operator:Różnica między dwoma ostatnimi polega na tym, że
hasOwnProperty
metoda sprawdzi, czy właściwość istnieje fizycznie na obiekcie (właściwość nie jest dziedziczona).in
Operator sprawdzi na wszystkich właściwości osiągalny w łańcuchu prototypów, np:Jak widać,
hasOwnProperty
zwracafalse
iin
operator wracatrue
podczas sprawdzaniatoString
metody, metoda ta jest zdefiniowana w łańcuchu prototypów, ponieważobj
dziedziczy formęObject.prototype
.źródło
typeof
zamiastif( obj.foo !== undefined )
?isset($abc->def->ghi->jkl)
bez zgłaszania wyjątku i zatrzymywania skryptu, w przeciwieństwie dotypeof
operatora JavaScript . Musisz użyć czegoś takiego jaktry{ abc.def.ghi.jkl; isset=true } catch(e){ isset=false }
Staroświecki wątek, ale istnieją nowe sposoby prowadzenia odpowiednika
isset()
.ESNext (etap 4 grudnia 2019 r.)
Dwie nowe składnie pozwalają nam znacznie uprościć korzystanie z
isset()
funkcjonalności:?.
)??
)Przeczytaj dokumenty i pamiętaj o zgodności przeglądarki.
Poprzednia odpowiedź
Wyjaśnienia poniżej. Uwaga Używam składni StandardJS
Przykładowe użycie
Funkcja odpowiedzi
Wyjaśnienie
PHP
Zauważ, że w PHP możesz odwoływać się do dowolnej zmiennej na dowolnej głębokości - nawet próbując uzyskać dostęp do nie-tablicy, ponieważ tablica zwróci prosty
true
lubfalse
:JS
W JavaScript nie mamy tej swobody, zawsze otrzymamy błąd, jeśli zrobimy to samo, ponieważ JS natychmiast próbuje uzyskać dostęp do wartości,
deeper
zanim będziemy mogli zawinąć ją w nasząisset()
funkcję, aby ...Więcej nieudanych alternatyw:
I niektóre działające alternatywy, które mogą szybko stać się zbędne:
Wniosek
Wszystkie pozostałe odpowiedzi - choć większość jest wykonalna ...
isset()
np
isset(some, 'nested.deeper.value')
eval()
który działa, ale ja osobiście go unikamMyślę, że dużo tego omówiłem. W mojej odpowiedzi zwracam uwagę na pewne kwestie, których nie dotykam, ponieważ - choć istotne - nie są częścią pytania. W razie potrzeby mogę zaktualizować swoją odpowiedź za pomocą linków do niektórych bardziej technicznych aspektów opartych na zapotrzebowaniu.
Spędziłem nad tym dużo czasu, więc mam nadzieję, że to pomaga ludziom wyjść.
Dziękuję za przeczytanie!
źródło
phpjs.org jest w większości na emeryturze na rzecz locutus Oto nowy link http://locutus.io/php/var/isset
źródło
isset(abc.def.ghi)
w przypadku, gdyabc.def
jest niezdefiniowany. Jednak łącząc to rozwiązanie z tym, które akceptuje nazwę zmiennej w postaci łańcucha, będzie ona identyczna z wersją PHP.źródło
źródło
To proste rozwiązanie działa, ale nie w przypadku głębokiego sprawdzania obiektu.
źródło
Zawsze używam tej funkcji ogólnej, aby uniknąć błędów w prymitywnych zmiennych, a także tablicach i obiektach.
źródło
Jeśli używasz podkreślenia , zawsze używam
źródło
Jest to dość kuloodporne rozwiązanie do testowania, czy istnieje zmienna:
Niestety nie można po prostu hermetyzować go w funkcji.
Możesz pomyśleć o zrobieniu czegoś takiego:
Spowoduje to jednak wygenerowanie błędu odniesienia, jeśli zmienna
variable
nie została zdefiniowana, ponieważ nie można przekazać funkcji do nieistniejącej zmiennej:Z drugiej strony pozwala 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
!==
jest już wartością logiczną.Przy użyciu jest zbyt długo, aby pisać. Ale nie możemy spakować
typeof
słowa kluczowego do funkcji, ponieważ błąd zostanie wygenerowany przed wywołaniem funkcji, tak jak poniżej:Więc wymyśliłem sposób:
Może pracować zarówno z pojedynczymi zmiennymi (zmiennymi, które w ogóle nie istnieją), jak i właściwościami obiektów (właściwości nieistniejące). I tylko 7 znaków więcej niż PHP
isset
.źródło
To rozwiązanie działało dla mnie.
źródło
isset(var)
zvar
rozbrojeniem:ReferenceError: var is not defined
źródło
isset(someVar)
GdziesomeVar
nigdy nie został zadeklarowany. Jednak biorąc pod uwagę toeval
, prawdopodobnie zamierzasz przekazać ciąg znaków . Pokaż użycie. Czy zamierzasz używaćisset('someVar')
? Jeśli tak, wygląda to podobnie do wcześniejszej odpowiedzi - co z twoją odpowiedzią jest nowa?plus testy:
https://gist.github.com/daylik/24acc318b6abdcdd63b46607513ae073
źródło
Aby sprawdzić, czy blok HTML istnieje, czy nie, używam tego kodu:
źródło
Podaj ścieżkę obiektu jako ciąg, a następnie możesz podzielić ten ciąg na ścieżkę i rozwiązać
hasOwnProperty
na każdym kroku, zastępując sam obiekt przy każdej iteracji.Jeśli kodujesz w środowisku ES6, spójrz na pytania dotyczące przepełnienia stosu .
źródło
Używam funkcji, która może sprawdzać zmienne i obiekty. bardzo wygodny w pracy z jQuery
źródło
To był dla mnie naprawdę problem, kiedy uzyskiwałem dostęp do głębszej właściwości obiektu, więc utworzyłem funkcję, która zwróci wartość właściwości, jeśli istnieje, w przeciwnym razie zwróci fałsz. Możesz go użyć, aby zaoszczędzić czas,
źródło
Jeśli chcesz sprawdzić, czy element istnieje, użyj następującego kodu:
To jest przykład:
źródło
źródło
Podręcznik PHP mówi:
I interfejs coś takiego:
bool isset ( mixed $var [, mixed $... ] )
Ten parametr
$var
jest zmienną do sprawdzenia. może mieć jednak dowolną liczbę parametrów.isset () zwraca,
TRUE
jeśli var istnieje i ma wartość inną niżNULL
.FALSE
Inaczej.Jakiś przykład:
Mając to na uwadze, Najwyraźniej nie jest możliwe napisanie dokładnego odpowiednika
isset()
funkcji php . Na przykład, gdy dzwonimy w ten sposób:Spust JavaScript
Uncaught ReferenceError: some_var is not defined at (file_name):line_number
. Ważną i niezwykłą rzeczą w tym zachowaniu jest to, że podczas próby przekazania nieistniejących zmiennych do normalnych funkcji wywoływany jest błąd.Ale w PHP
isset()
nie są tak naprawdę zwykłe funkcje, ale konstrukcje językowe. Oznacza to, że są częścią samego języka PHP, nie działają zgodnie z normalnymi regułami funkcji i dlatego mogą uniknąć błędu w przypadku nieistniejących zmiennych. Jest to ważne przy próbie ustalenia, czy zmienna istnieje, czy nie. Ale w javscript powoduje błąd, w pierwszej kolejności powiedz wywołanie funkcji z nieistniejącymi zmiennymi.Chodzi mi o to, że nie możemy napisać tego jako równoważnej funkcji javscript, ale możemy zrobić coś takiego
Jeśli chcesz dokładnie ten sam efekt PHP również sprawdź zmienna nie jest
NULL
Na przykład
Możemy więc włączyć to do javascript, a następnie wygląda to tak:
źródło
javascript isset
źródło
Uważaj w ES6 , wszystkie poprzednie rozwiązania nie działają, jeśli chcesz sprawdzić deklarację zmiennej let i zadeklarować ją, jeśli nie jest
przykład
zobaczysz błąd
Rozwiązaniem było zmienić to przez var
innym rozwiązaniem, jeśli możesz zmienić let przez var, musisz usunąć swój var
źródło
źródło