Gibt es null
in ES6 (ES2015 / JavaScript.next / Harmony) einen Operator für den Zugriff auf sichere Eigenschaften (Null-Weitergabe / Existenz), wie beispielsweise ?.
in CoffeeScript ? Oder ist es für ES7 geplant?
var aThing = getSomething()
...
aThing = possiblyNull?.thing
Dies wird ungefähr so sein:
if (possiblyNull != null) aThing = possiblyNull.thing
Idealerweise sollte die Lösung nicht (gerade undefined
) aThing
if zugeordnet possiblyNull
werdennull
if( obj?.nested?.property?.value )
anstelle vonif( obj && obj.nested && obj.nested.property && obj.nested.property.value )
var appConfig = loadConfig(config, process.env); connect(appConfig.database);
mitconnect(config)
. Sie können ein viel einfacheres Objekt zu übergeben ,connect
anstatt vorbei das ganzeconfig
Objekt, die Sie verwenden könnenconf.username
,conf.password
statt wie etwas versuchtconfig[process.env]?.database?.username
,config[process.env]?.database?.password
. Referenz: Gesetz von Demeter .loadConfig
obigen Beispiel erfolgen), können Sie Annahmen über das Vorhandensein von Eigenschaften treffen und die Nullprüfung in unzähligen Bereichen Ihrer App überspringen.Antworten:
Update (2020-01-31): Es scheint, dass die Leute dies immer noch finden. Hier ist die aktuelle Geschichte:
Update (01.08.2017): Wenn Sie ein offizielles Plugin verwenden möchten, können Sie den Alpha-Build von Babel 7 mit der neuen Transformation ausprobieren. Ihr Kilometerstand kann variieren
https://www.npmjs.com/package/babel-plugin-transform-optional-chaining
Original :
Eine Funktion, die dies erreicht, befindet sich derzeit in Stufe 1: Optionale Verkettung.
https://github.com/tc39/proposal-optional-chaining
Wenn Sie es heute verwenden möchten, gibt es ein Babel-Plugin, das dies ermöglicht.
https://github.com/davidyaha/ecmascript-optionals-proposal
quelle
street = user.address?.street
würde aufstreet
jeden fall setzen?Street
Ich denke würde zugewiesen werdenundefined
. Aber zumindest würde es nicht versuchen, auf undefinierte Eigenschaften zuzugreifen.=
wird dies in der offiziellen Spezifikation derzeit nicht unterstützt. github.com/tc39/proposal-optional-chaining#not-supportedEs ist nicht so schön wie das? Operator, aber um ein ähnliches Ergebnis zu erzielen, können Sie Folgendes tun:
Da
null
undundefined
beide falsche Werte sind ( siehe diese Referenz ), wird auf die Eigenschaft nach dem&&
Operator nur zugegriffen, wenn der Präzedenzfall nicht null oder undefiniert ist.Alternativ können Sie eine Funktion wie die folgende schreiben:
Verwendung:
Oder mit einem Fallback-Wert:
quelle
!(user && user.address && user.address.postcode)
foo && foo.bar && foo.bar.quux ...
In einer großen Codebasis ist dies hässlich und fügt eine Menge Komplexität hinzu, die Sie besser vermeiden sollten._get<T>(func: () => T, fallbackValue?: T) :T
user.address.postcode
undefiniert ist,_try(() => user.address.postcode, "")
wirdundefined
statt zurückgegeben""
. Der Code_try(() => user.address.postcode, "").length
löst also eine Ausnahme aus.Nein. Sie können in JavaScript lodash # get oder ähnliches verwenden.
quelle
lodash.get
ist insofern etwas anders, als es offensichtlich keine bedingte Zuweisung durchführen kann.Vanille-Alternative für sicheren Zugang zu Eigentum
Die prägnanteste bedingte Zuordnung wäre wahrscheinlich diese
quelle
possiblyNull
nicht definiert ist /null
?||=
(((a.b || {}).c || {}).d || {}).e
. Aber genauer wäre es((((a || {}).b || {}).c || {}).d || {}).e
Nein, in ES6 gibt es keinen Null-Ausbreitungsoperator. Sie müssen mit einem der bekannten Muster gehen .
Möglicherweise können Sie jedoch die Destrukturierung verwenden:Es gibt viele Diskussionen (z. B. diese ), um einen solchen Operator in ES7 hinzuzufügen, aber keine hat sich wirklich durchgesetzt.
quelle
aThing = possiblyNull.thing
null
. Sie müssten einen Standardwert angeben, der diesem Muster sehr ähnlich ist , jedoch eine verwirrendere Syntax aufweist.Anhand der Liste hier gibt es derzeit keinen Vorschlag, Ecmascript um eine sichere Durchquerung zu erweitern. Es gibt also nicht nur keinen guten Weg, dies zu tun, sondern es wird in absehbarer Zeit auch nicht hinzugefügt.
quelle
quelle
Optionale Verkettung
?.
und Nullish Coalescing??
Sie können jetzt direkt
?.
Inline verwenden, um die Existenz sicher zu testen. Alle modernen Browser unterstützen dies.??
kann verwendet werden, um einen Standardwert festzulegen, wenn undefiniert oder null.Wenn eine Eigenschaft vorhanden ist, fahren Sie
?.
mit der nächsten Prüfung fort oder geben Sie den gültigen Wert zurück. Jeder Fehler wird sofort kurzgeschlossen und kehrt zurückundefined
.Um einen standardmäßig definierten Wert sicherzustellen, können Sie verwenden
??
. Wenn Sie den ersten Wahrheitswert benötigen, können Sie verwenden||
.Wenn Sie einen Fall nicht überprüfen, muss die Eigenschaft auf der linken Seite vorhanden sein. Wenn nicht, wird eine Ausnahme ausgelöst.
?.
Browser-Unterstützung - 78%, Juli 2020??
Browser-Unterstützung - 78%Mozilla-Dokumentation
- -
Logische Nullzuweisung, 2020+ Lösung
Derzeit werden den Browsern neue Operatoren hinzugefügt
??=
,||=
und&&=
. Sie tun nicht ganz das, wonach Sie suchen, können jedoch je nach Ziel Ihres Codes zu demselben Ergebnis führen.??=
prüft, ob die linke Seite undefiniert oder null ist, kurzgeschlossen, falls bereits definiert. Wenn nicht, wird der linken Seite der Wert für die rechte Seite zugewiesen.||=
und&&=
sind ähnlich, basieren jedoch auf den Operatoren||
und&&
.Grundlegende Beispiele
Objekt- / Array-Beispiele
Browser-Unterstützung Juli 2020 - 0,03%
Mozilla-Dokumentation
quelle
?.
und??
und eine detaillierte bevorstehende Lösung hinzugefügt , die für Ihre Situation geeignet sein könnte. Die beste aktuelle Lösung ist wahrscheinlich, es einfach zu tunaThing = possiblyNull?.thing ?? aThing
Eine sichere Deep-Get-Methode scheint eine natürliche Passform für underscore.js zu sein, aber dort besteht das Problem darin, die Zeichenfolgenprogrammierung zu vermeiden. Ändern der Antwort von @ Felipe, um die Programmierung von Zeichenfolgen zu vermeiden (oder zumindest Randfälle an den Aufrufer zurückzuschieben):
Beispiel:
quelle
_.get(obj, array_or_dotstring)
obj.a.b.c
vsobj['a']['b']['c']
keys
das?Ich weiß, dass dies eine JavaScript-Frage ist, aber ich denke, Ruby behandelt dies auf alle angeforderten Arten, daher denke ich, dass dies ein relevanter Bezugspunkt ist.
.&
,try
Und && ihre Stärken und mögliche Gefahren haben. Eine große Auswahl dieser Optionen finden Sie hier: http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/TLDR; Die Schlussfolgerung der Rubyisten ist, dass dies
dig
sowohl augenschonender als auch eine stärkere Garantie dafür ist, dass ein Wertnull
zugewiesen wird oder zugewiesen wird.Hier ist eine einfache Implementierung in TypeScript:
Dies kann für jede Verschachtelungstiefe verwendet werden und behandelt Funktionen.
Der
try
Ansatz ist in JS ebenso gut zu lesen, wie in den vorherigen Antworten gezeigt. Es ist auch keine Schleife erforderlich, was ein Nachteil dieser Implementierung ist.quelle
Ich dachte, diese Frage müsste für 2018 etwas aktualisiert werden. Dies kann ohne Verwendung von Bibliotheken problemlos durchgeführt werden
Object.defineProperty()
und kann wie folgt verwendet werden:Ich halte dies für sicher (und js-ethisch) aufgrund der
writeable
undenumerable
Definitionen, die jetzt für diedefineProperty
Methode von verfügbar sindObject
, wie in MDN dokumentiertFunktionsdefinition unten:
Ich habe einen jsBin mit Konsolenausgabe zusammengestellt, um dies zu demonstrieren. Beachten Sie, dass ich in der jsBin-Version auch eine benutzerdefinierte Ausnahme für leere Werte hinzugefügt habe. Dies ist optional, und deshalb habe ich es aus der obigen Minimaldefinition herausgelassen.
Verbesserungen sind willkommen
quelle