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 = {};

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 :)


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

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.


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.


-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


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]

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.