Ich erkläre anhand eines Beispiels:
Elvis Operator (? :)
Der "Elvis-Operator" ist eine Abkürzung des ternären Operators von Java. Ein Beispiel dafür ist die Rückgabe eines "vernünftigen Standardwerts", wenn ein Ausdruck in "false" oder "null" aufgelöst wird. Ein einfaches Beispiel könnte folgendermaßen aussehen:
def gender = user.male ? "male" : "female" //traditional ternary operator usage
def displayName = user.name ?: "Anonymous" //more compact Elvis operator
Sicherer Navigationsbetreiber (?.)
Der Operator "Sichere Navigation" wird verwendet, um eine NullPointerException zu vermeiden. Wenn Sie einen Verweis auf ein Objekt haben, müssen Sie möglicherweise überprüfen, ob dieser nicht null ist, bevor Sie auf Methoden oder Eigenschaften des Objekts zugreifen. Um dies zu vermeiden, gibt der Operator für die sichere Navigation einfach null zurück, anstatt eine Ausnahme auszulösen:
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
quelle
quelle
??
) in Javascript bereitstellen ? Alles, was ich bisher finde, deutet darauf hin, dass JS nur "Falsey" hat, das verschmilzt (mit||
).Antworten:
Sie können den logischen ODER-Operator anstelle des Elvis-Operators verwenden:
Zum Beispiel
displayname = user.name || "Anonymous"
.Derzeit verfügt Javascript jedoch nicht über die anderen Funktionen. Ich würde empfehlen, sich CoffeeScript anzusehen, wenn Sie eine alternative Syntax wünschen. Es hat eine Abkürzung, die dem ähnelt, wonach Sie suchen.
Zum Beispiel Der Existenzoperator
Funktionsverknüpfungen
Sexy Funktionsaufruf
Es gibt auch mehrzeilige Kommentare und Klassen. Natürlich müssen Sie dies zu Javascript kompilieren oder in die Seite einfügen,
<script type='text/coffeescript>'
aber es fügt eine Menge Funktionen hinzu :). Die Verwendung<script type='text/coffeescript'>
ist eigentlich nur für die Entwicklung und nicht für die Produktion gedacht.quelle
<script type='coffee/script>'
?<script type="text/coffeescript">
.x === undefined
.Ich denke, das Folgende entspricht dem sicheren Navigationsoperator, wenn auch etwas länger:
streetName
wird dann entweder der Wert vonuser.address.street
oder seinundefined
.Wenn Sie möchten, dass standardmäßig etwas anderes verwendet wird, können Sie es mit der obigen Verknüpfung kombinieren oder Folgendes angeben:
quelle
Der logische ODER-Operator von Javascript ist kurzgeschlossen und kann Ihren "Elvis" -Operator ersetzen:
Meines Wissens gibt es jedoch kein Äquivalent zu Ihrem
?.
Betreiber.quelle
||
könnte so verwendet werden. Seien Sie sich bewusst , dass dies nicht nur zusammenwachsen, wenn der Ausdruck istnull
, sondern auch , wenn es nicht definiert,false
,0
, oder die leere Zeichenkette.""
oder0
könnte aber unerwartet sein :)Ich habe gelegentlich die folgende Redewendung nützlich gefunden:
kann umgeschrieben werden als:
Dies nutzt die Tatsache aus, dass das Abrufen unbekannter Attribute für ein Objekt undefiniert zurückgibt, anstatt wie bei
null
oder eine Ausnahme auszulösen. Daherundefined
ersetzen wir null und undefiniert durch ein leeres Objekt, bevor wir navigieren.quelle
&&
Methode. +1.Ich denke, Lodash
_.get()
kann hier wie in_.get(user, 'name')
und bei komplexeren Aufgaben wie helfen_.get(o, 'a[0].b.c', 'default-value')
quelle
Derzeit gibt es einen Spezifikationsentwurf:
https://github.com/tc39/proposal-optional-chaining
https://tc39.github.io/proposal-optional-chaining/
Im Moment benutze
get(object, path [,defaultValue])
ich jedoch gerne lodash oder dlvdelve(obj, keypath)
Update (Stand 23. Dezember 2019):
quelle
Update 2019
JavaScript hat jetzt Entsprechungen sowohl für den Elvis Operator als auch für den Safe Navigation Operator.
Sicherer Zugang zu Eigentum
Der optionale Verkettungsoperator (
?.
) ist derzeit ein ECMAScript- Vorschlag der Stufe 4 . Sie können es heute mit Babel verwenden .Der logische AND-Operator (
&&
) ist die "alte", ausführlichere Methode, um mit diesem Szenario umzugehen.Standard angeben
Der nullish coalescing operator (
??
) ist derzeit ein ECMAScript- Vorschlag der Stufe 3 . Sie können es heute mit Babel verwenden . Sie können einen Standardwert festlegen, wenn die linke Seite des Operators ein Nullwert ( / ) ist.null
undefined
Der logische ODER-Operator (
||
) ist eine alternative Lösung mit leicht unterschiedlichem Verhalten . Sie können einen Standardwert festlegen, wenn die linke Seite des Operators falsch ist . Beachten Sie, dass sich das Ergebnis vonmyVariable3
unten vonmyVariable3
oben unterscheidet.quelle
Für die erstere können Sie verwenden
||
. Der Javascript-Operator "logisch oder" gibt nicht nur vordefinierte wahre und falsche Werte zurück, sondern folgt auch der Regel, dass das linke Argument zurückgegeben wird, wenn es wahr ist, und ansonsten das rechte Argument bewertet und zurückgegeben wird. Wenn ich ist nur in dem Wahrheitswert interessiert funktioniert es die gleiche, aber es bedeutet auch , dassfoo || bar || baz
wieder den ganz links von foo, bar, oder baz , die einen wahren Wert enthält .Sie werden jedoch keine finden, die false von null unterscheiden kann, und 0 und leere Zeichenfolge sind falsche Werte. Vermeiden Sie daher die Verwendung des
value || default
Konstrukts, bei dem zuvalue
Recht 0 oder 0 sein kann""
.quelle
Ja da ist! 🍾
Die optionale Verkettung befindet sich in Stufe 4, sodass Sie die
user?.address?.street
Formel verwenden können.Wenn Sie die Veröffentlichung nicht abwarten können, installieren
@babel/plugin-proposal-optional-chaining
Sie sie und Sie können sie verwenden. Hier sind meine Einstellungen, die für mich funktionieren, oder lesen Sie einfach Nimmos Artikel .quelle
Hier ist ein einfaches Äquivalent zum Elvis-Operator:
quelle
UPDATE SEP 2019
Ja, JS unterstützt dies jetzt. Optionale Verkettung kommt bald zu v8. Lesen Sie mehr
quelle
Dies ist allgemein als Null-Koaleszenz-Operator bekannt. Javascript hat keine.
quelle
Sie können ungefähr den gleichen Effekt erzielen, indem Sie sagen:
quelle
Ich habe eine Lösung dafür, passe sie an deine eigenen Bedürfnisse an, einen Auszug aus einer meiner Bibliotheken:
klappt wunderbar. Genieße die weniger Schmerzen!
quelle
Sie könnten Ihre eigenen rollen:
Und benutze es so:
* Ergebnis ist undefiniert, wenn eines von a, b, c oder d undefiniert ist.
quelle
Ich habe diesen Artikel gelesen ( https://www.beyondjava.net/elvis-operator-aka-safe-navigation-javascript-typescript ) und die Lösung mithilfe von Proxies geändert.
Sie nennen es so:
Das Ergebnis ist für einen Ausdruck undefiniert, der auf seinem Pfad auf null oder undefiniert stößt. Sie könnten wild werden und den Objektprototyp modifizieren!
quelle
Sehr spät dran, gibt es einen Vorschlag [1] für eine optionale Verkettung, der sich derzeit in Stufe 2 befindet, mit einem Babel-Plugin [2]. Es befindet sich derzeit in keinem mir bekannten Browser.
quelle
Das war lange Zeit ein Problem für mich. Ich musste eine Lösung finden, die leicht migriert werden kann, sobald wir den Elvis-Operator oder etwas anderes haben.
Das benutze ich; funktioniert sowohl für Arrays als auch für Objekte
füge dies in die Datei tools.js oder so ein
Anwendungsbeispiel:
Nun, ich weiß, es macht den Code ein bisschen unlesbar, aber es ist eine einfache Einzeiler-Lösung und funktioniert großartig. Ich hoffe es hilft jemandem :)
quelle
Dies war eine interessante Lösung für den sicheren Navigationsbetreiber, der ein Mixin verwendete.
http://jsfiddle.net/avernet/npcmv/
quelle
Ich habe ein Paket erstellt, das die Verwendung erheblich vereinfacht.
NPM jsdig Github jsdig
Sie können mit einfachen Dingen wie und Objekt umgehen:
oder etwas komplizierter:
quelle
Persönlich benutze ich
und zum Beispiel sicher bekommen:
quelle
e({a:{b:{c:{d:'test'}}}}, 'a.b.c.d')
kehrt zurücknull
.e = eval
,var a = eval('obj.a.b.c.d')
.eval
nimmt nicht einmal einen zweiten Parameter ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…