Wiem, że mogę przetestować zmienną javascript, a następnie zdefiniować ją, jeśli jest niezdefiniowana, ale czy nie ma sposobu na powiedzenie
var setVariable = localStorage.getItem ('value') || 0;
wydaje się dużo jaśniejszy sposób i jestem prawie pewien, że widziałem to w innych językach.
javascript
undefined
pedalpete
źródło
źródło
localStorage.getItem()
spowoduje to zgłoszenie wyjątku, jeśli użytkownik wyłączył pliki cookie (przynajmniej w Chrome), więc możesz chcieć zawrzeć go wtry...catch
klauzuliOdpowiedzi:
Tak, może to zrobić, ale ściśle mówiąc, przypisze wartość domyślną, jeśli pobrana wartość jest fałszywa , w przeciwieństwie do naprawdę niezdefiniowanej . Jest zatem nie tylko pasuje
undefined
, ale równieżnull
,false
,0
,NaN
,""
(ale nie"0"
).Jeśli chcesz ustawić wartość domyślną tylko wtedy, gdy zmienna jest ściśle
undefined
określona, najbezpieczniejszym sposobem jest napisanie:W nowszych przeglądarkach można bezpiecznie pisać:
należy jednak pamiętać, że można to odwrócić w starszych przeglądarkach, w których wolno było zadeklarować zmienną o nazwie,
undefined
która ma zdefiniowaną wartość, co spowodowało niepowodzenie testu.źródło
var x = (x === undefined ? def_val : x);
jako nieco dłuższegovar x = (typeof x === 'undefined') ? def_val : x;
. Czy zachowanie się różni?undefined
było przedefiniować, co powodowało niepowodzenie testu równości.||
podejścia w ścisłym teście dla undefined, musisz użyć jawnego testu dlaundefined
warunku.Odpowiedź 2018 ES6 to :
Jeśli zmienna x jest niezdefiniowana, zwraca zmienną y ... w przeciwnym razie, jeśli zmienna x jest zdefiniowana, zwraca zmienną x.
źródło
Object.is
nie jest lepsze niż===
w tym przypadku. „Operator === (a także operator ==) traktuje wartości liczbowe -0 i +0 jako równe i traktuje Number.NaN jako różne od NaN.” ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) Nie ma tutaj znaczenia.Object.is
jeśli oba operandy mogą byćNaN
.undefined
. Więc===
będzie działać w 100% przypadków, a nie tylko w 98%. Zaletą===
jest to, że jest łatwiejszy do odczytania, zwłaszcza na pierwszy rzut oka, krótszy i pozwala uniknąć niepotrzebnego wywołania metody. Osobiście używałbym tylkoObject.is()
wtedy, gdy sytuacja tego wymaga i wolałbym===
we wszystkich innych przypadkach.Musiałem „ustawić zmienną, jeśli jest niezdefiniowana” w kilku miejscach. Utworzyłem funkcję za pomocą odpowiedzi @Alnitak. Mam nadzieję, że to komuś pomoże.
Stosowanie:
źródło
Bardziej logiczne wydaje się sprawdzenie
typeof
zamiastundefined
? Zakładam, że oczekujesz liczby, ustawiając zmienną na0
undefined:W tym przypadku, jeśli
getVariable
nie jest liczbą (ciągiem, obiektem, czymkolwiek), ustawiana jest wartość setVariable0
źródło
Odpowiedź ES2020
Za pomocą zerowego operatora łączenia można ustawić wartość domyślną, jeśli
value
jest równa zeru lub nieokreślona.Należy jednak pamiętać, że nullish coalescing operator nie zwraca wartości domyślnej dla innych typów fałszywych wartości, takich jak
0
i''
.Zwróć uwagę, że obsługa przeglądarki przez operatora jest ograniczona. Według danych caniuse obsługiwanych jest tylko 48,34% przeglądarek (stan na kwiecień 2020). Obsługa Node.js została dodana w wersji 14 .
źródło
Jeśli jesteś fanem FP ( programowania funkcjonalnego ), Ramda ma fajną funkcję pomocniczą o nazwie defaultTo :
stosowanie:
const result = defaultTo(30)(value)
Jest to bardziej przydatne w przypadku
undefined
wartości logicznych:const result2 = defaultTo(false)(dashboard.someValue)
źródło
const result = value || 30;
, z wyjątkiem używania funkcji pośredniej i +1000 bajtów libvar setVariable = (typeof localStorage.getItem('value') !== 'undefined' && localStorage.getItem('value')) || 0;
źródło
localStorage.getItem('value'))
zwrócifalse
Dzisiaj również wpadłem na ten scenariusz, w którym nie chciałem, aby zero zostało nadpisane dla kilku wartości. Mamy plik z kilkoma typowymi metodami narzędziowymi dla takich scenariuszy. Oto, co dodałem, aby poradzić sobie ze scenariuszem i być elastycznym.
Następnie można go wywołać z dwoma ostatnimi parametrami, które są opcjonalne, jeśli chcę ustawić tylko niezdefiniowane wartości lub nadpisać wartości null lub 0. Oto przykład wywołania, które ustawi identyfikator na -1, jeśli identyfikator jest niezdefiniowany lub pusty, ale nie nadpisze wartości 0.
źródło
W dzisiejszych czasach możesz zrobić swoje podejście za pomocą JS:
Twój przykład BĘDZIE działał:
źródło
Działa nawet, jeśli wartość domyślna jest wartością logiczną:
źródło
Wydaje mi się, że przy obecnych implementacjach javascript,
to dobry sposób na zrobienie tego (za pomocą dekonstrukcji obiektów).
źródło
Logiczne przypisanie zerowe, rozwiązanie ES2020 +
Nowi operatorzy są obecnie dodawane do przeglądarek
??=
,||=
oraz&&=
. Ten post skupi się na??=
.Sprawdza, czy lewa strona jest niezdefiniowana lub zerowa, zwarcie, jeśli jest już zdefiniowane. Jeśli nie, prawa strona jest przypisywana do zmiennej lewej strony.
Porównanie metod
Podstawowe przykłady
Przykłady obiektów / tablic
?? = Obsługa przeglądarek, lipiec 2020 r. - 0,03%
?? = Dokumentacja Mozilli
|| = Dokumentacja Mozilli
&& = Dokumentacja Mozilli
źródło