Ruby's || = (oder gleich) in JavaScript?

126

Ich liebe Rubys ||=Mechanismus. Wenn eine Variable nicht existiert oder existiert nil, erstellen Sie sie und setzen Sie sie gleich:

amount # is nil
amount ||= 0 # is 0
amount ||= 5 # is 0

Ich muss jetzt etwas Ähnliches in JavaScript tun. Was ist die Konvention oder der richtige Weg, dies zu tun? Ich weiß, ||=ist keine gültige Syntax. 2 offensichtliche Möglichkeiten, damit umzugehen, sind:

window.myLib = window.myLib || {};

// or

if (!window.myLib)
  window.myLib = {};
beim.
quelle

Antworten:

150

Beide sind absolut richtig, aber wenn Sie nach etwas suchen, das wie ||=in Rubin funktioniert . Die erste Methode, die variable = variable || {}Sie suchen :)

Dzung Nguyen
quelle
21

Sie können den logischen ODER-Operator verwenden, ||der den richtigen Operanden auswertet, wennlVal es sich um einen falschen Wert handelt.

Falsche Werte umfassen z null, false, 0, "", undefined, NaN

x = x || 1
Moritz Roessler
quelle
4

Wenn Sie mit Objekten arbeiten, können Sie die Destrukturierung (seit ES6) wie folgt verwenden:

({ myLib: window.myLib = {} } = window);

... aber Sie gewinnen nichts über die akzeptierte Antwort außer Verwirrung.

Ahnung
quelle
1
"aber Sie gewinnen nichts über die akzeptierte Antwort außer Verwirrung" - nett. :)
Lindes
Ich wette, jemand wird dies als Grund nehmen, Javascript zu hassen
Volper
1

Der Operator, nach dem Sie gefragt haben, wurde als Funktion in JavaScript vorgeschlagen . Es befindet sich derzeit in Phase 3 , ist also noch kein offizieller Teil der Sprache, wird jedoch akzeptiert, mit höchstens geringfügigen Änderungen, wenn größere unerwartete Probleme auftreten.

Sie können es jetzt mit dem Plugin-Vorschlag-logischen Zuweisungsoperator Babel-Plugin verwenden . Ich habe dieses Plugin noch nie benutzt, daher habe ich keine Ahnung, wie gut es funktioniert.

Elias Zamaria
quelle
-1

Ruby's || = Bedienerkurzschlusszuordnung. Man kann sich das so vorstellen:

return a || a = b

In Javascript sieht das also sehr ähnlich aus:

return a || (a = b);

Wie in den Kommentaren unten ausgeführt, scheint diese wörtliche Rubinform jedoch weniger effizient zu sein als das Standard-Javascript-Idiom a = a || b.

Als Referenz: http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html

chris
quelle
1
In der Praxis scheint das a = a || bFormular optimaler zu sein. Jsperf.com/x-or-x-equals-0-vs-x-equals-x-or-0/3
jchook
ah cooles Werkzeug. Wie sieht es aus, wenn x einen Wert hat und so kurzschließt?
Chris
Ich glaube, dass Teardown auf jsperf explizit sein muss, daher sollte dieser Test die Kurzschlussleistung zeigen. Ich vermute, dass V8 eine spezielle Optimierung für das Formular hat a = a || b.
Jchook
3
Zu Ihrer Information: Es sieht so aus, als ob der Unterschied, den es gab, jetzt optimiert wurde.
Charles Wood
a || (a = b)hat die richtige Semantik, um Funktionsnamen abzuleiten. Der neue Vorschlag wird derzeit diskutiert .
user4642212
-1

Sie können das gewünschte Verhalten mit dem Operator | = in Javascript nur für Ganzzahlen erreichen. Aber Sie müssen zuerst die Variable definieren.

let a = 0
a |= 100
console.log(a) // 100

Für Objekte

let o = {}
o.a |= 100
console.log(o) // {a: 100}

Für Arrays

let arr = []
arr[0] |= 100
console.log(arr) // [100]
Wallgeek
quelle
Die Frage ist nicht über |oder |=. Das gewünschte Verhalten in der Frage hängt nicht mit bitweisen Operationen zusammen.
user4642212
Sie haben Recht, ich werde die Antwort entsprechend bearbeiten
wallgeek
Bearbeitet. Ich hoffe es macht jetzt Sinn.
Wallgeek