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.