Wytłumaczę na przykładzie:
Elvis Operator (?:)
„Operator Elvisa” to skrót od trójskładnikowego operatora Javy. Jednym z przykładów, w których jest to przydatne, jest zwrócenie „rozsądnej wartości domyślnej”, jeśli wyrażenie ma wartość false lub zero. Prosty przykład może wyglądać następująco:
def gender = user.male ? "male" : "female" //traditional ternary operator usage
def displayName = user.name ?: "Anonymous" //more compact Elvis operator
Operator bezpiecznej nawigacji (?.)
Operator Bezpiecznej nawigacji służy do unikania wyjątku NullPointerException. Zazwyczaj, gdy masz odwołanie do obiektu, może być konieczne sprawdzenie, czy nie ma on wartości zerowej przed uzyskaniem dostępu do metod lub właściwości obiektu. Aby tego uniknąć, operator bezpiecznej nawigacji po prostu zwróci wartość null zamiast zgłaszania wyjątku:
def user = User.find( "admin" ) //this might be null if 'admin' does not exist
def streetName = user?.address?.street //streetName will be null if user or user.address is null - no NPE thrown
javascript
jquery
groovy
safe-navigation-operator
tiagomac
źródło
źródło
??
) w javascript? Wszystko, co do tej pory znajdowałem, sugeruje, że JS ma tylko „falsey” koalescencji (używania||
).Odpowiedzi:
Możesz użyć logicznego operatora „LUB” zamiast operatora Elvisa:
Na przykład
displayname = user.name || "Anonymous"
.Jednak Javascript nie ma obecnie innych funkcji. Polecam spojrzenie na CoffeeScript, jeśli chcesz alternatywną składnię. Ma trochę skrót, który jest podobny do tego, czego szukasz.
Na przykład operator egzystencjalny
Skróty funkcji
Seksowne wywołanie funkcji
Istnieją również komentarze i zajęcia wieloliniowe. Oczywiście musisz to skompilować do javascript lub wstawić na stronę, ponieważ
<script type='text/coffeescript>'
dodaje to wiele funkcji :). Używanie<script type='text/coffeescript'>
jest tak naprawdę przeznaczone tylko do rozwoju, a nie do produkcji.źródło
<script type='coffee/script>'
?<script type="text/coffeescript">
.x === undefined
.Myślę, że poniższe informacje są równoważne operatorowi bezpiecznej nawigacji, choć nieco dłużej:
streetName
będzie wówczas wartościąuser.address.street
lubundefined
.Jeśli chcesz, aby domyślnie był ustawiony na coś innego, możesz połączyć go z powyższym skrótem lub podać:
źródło
Logiczny operator OR Javascript powoduje zwarcie i może zastąpić operatora „Elvis”:
Jednak o ile wiem, twój
?.
operator nie ma odpowiednika .źródło
||
można tego użyć. Należy pamiętać, że to będzie łączyć nie tylko wtedy, gdy wyrażenie jestnull
, ale także, gdy jest niezdefiniowany,false
,0
, lub pusty ciąg.""
lub0
może być nieoczekiwany :)Czasami znajduję następujący idiom:
może być przepisany jako:
Wykorzystuje to fakt, że uzyskiwanie nieznanych atrybutów dla obiektu zwraca niezdefiniowane, zamiast rzucania wyjątku, jak to robi na
null
lubundefined
, dlatego przed nawigacją zastępujemy pusty i niezdefiniowany pusty obiekt.źródło
&&
metoda. +1.myślę, że lodash
_.get()
może pomóc tutaj, jak_.get(user, 'name')
i przy bardziej złożonych zadaniach, takich jak_.get(o, 'a[0].b.c', 'default-value')
źródło
Obecnie istnieje wersja robocza specyfikacji:
https://github.com/tc39/proposal-optional-chaining
https://tc39.github.io/proposal-optional-chaining/
Na razie jednak lubię używać lodash
get(object, path [,defaultValue])
lub dlvdelve(obj, keypath)
Aktualizacja (stan na 23 grudnia 2019 r.):
źródło
Aktualizacja 2019
JavaScript ma teraz odpowiedniki zarówno dla Elvisa Operatora, jak i Operatora Bezpiecznej Nawigacji.
Bezpieczny dostęp do nieruchomości
Opcjonalnie operatora łańcuchowym (
?.
) jest obecnie etap 4 ECMAScript Wniosek . Możesz go używać dzisiaj z Babel .Logiczny AND operator (
&&
) jest „stary”, bardziej rozwlekły sposób obsługiwać ten scenariusz.Zapewnienie wartości domyślnej
Nullish operatora koalescencyjny (
??
) jest obecnie etap 3 ECMAScript Wniosek . Możesz go używać dzisiaj z Babel . Pozwala ustawić wartość domyślną, jeśli lewa strona operatora jest wartością zerową (null
/undefined
).Operator logiczny LUB (
||
) jest alternatywne rozwiązanie z nieco odmienne zachowanie . Pozwala ustawić wartość domyślną, jeśli lewa strona operatora jest fałszywa . Pamiętaj, że wynikmyVariable3
poniżej różni się odmyVariable3
powyższego.źródło
W przypadku tego pierwszego możesz użyć
||
. Operator „logiczny lub” JavaScript, zamiast po prostu zwracać zapisane w prawdzie i fałszu wartości, kieruje się zasadą zwracania lewego argumentu, jeśli jest prawdziwy, a poza tym oceniania i zwracania prawego argumentu. Gdy interesuje Cię tylko wartość prawdy, działa ona tak samo, ale oznacza to również, żefoo || bar || baz
zwraca wartość skrajnie lewą z wartości foo, bar lub baz, która zawiera wartość prawdziwą .Nie znajdziesz jednak takiego, który odróżniałby fałsz od null, a 0 i pusty ciąg są wartościami fałszywymi, więc unikaj używania
value || default
konstrukcji, gdzievalue
może to być 0 lub""
.źródło
Tak jest! 🍾
Opcjonalne tworzenie łańcuchów znajduje się na etapie 4, co umożliwia użycie
user?.address?.street
formuły.Jeśli nie możesz się doczekać wydania, zainstaluj
@babel/plugin-proposal-optional-chaining
i możesz go użyć. Oto moje ustawienia, które działają dla mnie lub po prostu przeczytaj artykuł Nimmo .źródło
Oto prosty odpowiednik operatora elvis:
źródło
AKTUALIZACJA WRZESIEŃ 2019
Tak, JS obsługuje to teraz. Opcjonalne łączenie już wkrótce w wersji v8 czytaj więcej
źródło
Jest to bardziej znane jako operator zerowo-koalescencyjny. JavaScript nie ma takiego.
źródło
Możesz osiągnąć mniej więcej ten sam efekt, mówiąc:
źródło
Mam na to rozwiązanie, dostosuj je do własnych potrzeb, fragment jednego z moich libów:
działa jak marzenie. Ciesz się mniejszym bólem!
źródło
Możesz rzucić własny:
I użyj tego w ten sposób:
* wynik jest niezdefiniowany, jeśli jeden z a, b, c lub d jest niezdefiniowany.
źródło
Przeczytałem ten artykuł ( https://www.beyondjava.net/elvis-operator-aka-safe-navigation-javascript-typescript ) i zmodyfikowałem rozwiązanie za pomocą proxy.
Nazywasz to tak:
Wynik będzie niezdefiniowany dla wyrażenia, które napotka null lub niezdefiniowane na swojej ścieżce. Możesz zwariować i zmodyfikować prototyp Object!
źródło
Skacząc bardzo późno, jest obecnie propozycja [1] opcjonalnego łączenia łańcuchów na etapie 2, z dostępną wtyczką babel [2]. Obecnie nie ma go w żadnej znanej mi przeglądarce.
źródło
To był dla mnie problem przez długi czas. Musiałem znaleźć rozwiązanie, które można łatwo migrować, gdy tylko dostaniemy operatora Elvisa lub coś takiego.
Tego używam; działa zarówno dla tablic, jak i obiektów
umieść to w pliku tools.js lub coś takiego
przykład użycia:
Cóż, wiem, że sprawia, że kod jest nieco nieczytelny, ale jest to proste rozwiązanie liniowe i działa świetnie. Mam nadzieję, że to komuś pomoże :)
źródło
Było to interesujące rozwiązanie dla bezpiecznego operatora nawigacji korzystającego z niektórych mixin ..
http://jsfiddle.net/avernet/npcmv/
źródło
Stworzyłem pakiet, który sprawia, że jest to o wiele łatwiejsze w użyciu.
NPM jsdig Github jsdig
Możesz obsługiwać proste rzeczy, takie jak i sprzeciwiać się:
lub trochę bardziej skomplikowane:
źródło
Osobiście korzystam
i na przykład bezpiecznie uzyskaj:
źródło
e({a:{b:{c:{d:'test'}}}}, 'a.b.c.d')
zwracanull
.e = eval
,var a = eval('obj.a.b.c.d')
.eval
nie bierze nawet drugiego parametru ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…