Gemäß ECMA-262, Teil 11,13, folgende ist die erschöpfende Liste von Verbindung Zuweisungsoperator: *= /= %= += -= <<= >>= >>>= &= ^= |=
.
Nach dem Teil 11.11 var c = a || b
wird der a
Wert in c
if gesetzt , wenn er ToBoolean(a)
wahr ist, und wird der b
Wert in c
else gesetzt. Daher wird das logische ODER häufig als Vereinigungsoperator verwendet, z
function (options) {
options = options || {};
}
Häufig genug, coalesce wird verwendet , um den Standardwert für die Variable angeben, wie oben gezeigt wurde: a = a || b
.
Es scheint , dass die Verbindung Zuweisungsoperator ||=
wäre wirklich nützlich sein, so dass der Code oben in einer kürzeren und sauberere Art und Weise schreiben: a ||= b
. Allerdings ist es nicht , dass es (obwohl *=
, +=
und andere zusammengesetzte Zuweisungsoperatoren sind).
Die Frage ist, warum?
quelle
+=
,*=
,-=
,/=
, warum nicht%=
funktioniert?).angle %= 360
odervertexIndex %= numberOfVertices
(für die Scheitelpunktliste eines geschlossenen Polygons).||=
und&&=
bald kommen würde: "Sie können froh sein zu erfahren, dass für JS2 / ES4 auch || = und && = hinzugefügt werden. || = sind die meisten nützlich für beide, aber es gibt keinen Grund, die Zuweisungsform von && auszulassen. " .Antworten:
Ein möglicher Grund ist , dass die logischen Operatoren
&&
und||
haben „Kurzschließen“ Verhalten. Der rechte Operand von&&
und||
wird nur ausgewertet, wenn dies erforderlich ist. Vielleicht aus diesem Grund haben die Sprachdesigner entschieden, dass die Bedeutung eines Ausdrucks wiea ||= f()
nicht offensichtlich ist, und deshalb sollten solche Operatoren besser weggelassen werden.quelle
a ||= b
dies so interpretiert werden solltea = a || b
, aber tatsächlich kann es so seina || a = b
(wie in Ruby ). Sie können unterschiedlich sein, wenn der Setter Nebenwirkungen hat. Die Auswahl einer Option kann für Benutzer im anderen Camp schlecht sein. Ich persönlich mag dena || a = b
Weg (den Ruby-Weg), bin mir aber nicht sicher, ob alle damit zufrieden sind.Die allgemeine Antwort auf alle Fragen zu "Warum wurde diese Sprachfunktion nicht implementiert?" Ist, dass das Team, das die Sprache entworfen hat, entschieden hat, dass der Nutzen die Kosten nicht überwiegt.
Kosten können viele Formen annehmen. Die Implementierung eines Sprachfeatures erfordert viel Zeit und Mühe, ist jedoch auch mit den Kosten der Komplexität verbunden: Verursacht das Feature eine Komplexität oder Mehrdeutigkeit der Sprache, die in keinem Verhältnis zu ihrem potenziellen Nutzen steht?
Der hypothetische
||=
Operator unterscheidet sich grundlegend von den anderen zusammengesetzten Zuweisungsoperatoren. Während die anderen Operatoren rein mathematischer Natur sind, ist dieser anders: Er ersetzt einen Wert durch einen anderen (in dem von Ihnen beschriebenen Kontext).Angesichts dieser Mehrdeutigkeit (der Operator führt je nach Kontext zwei verschiedene Funktionen aus) ist es nicht schwer zu erkennen, warum er nicht in der Sprache enthalten war. Obwohl Sie sagen, dass sich das ändert
zu
Null-Koaleszenz durchzuführen ist ein wertvolles Merkmal, der Nutzen ist mir weit weniger klar. Wenn eine Wertersetzung erfolgen soll, erscheint es logisch (und klarer), beide Werte auf der rechten Seite des Gleichheitszeichens zu haben, um einen visuellen Hinweis darauf zu geben, dass eine solche Ersetzung auftreten kann.
C # hat einen anderen Pfad eingeschlagen und verwendet einen bestimmten Operator für die Nullzusammenführung.
quelle
foo = foo || bar
dass Sie bei der Eingabefoo
zweimal eingeben müssen . Dies ist sowohl umständlich als auch anfällig für das Refactoring von Tippfehlern.||=
Operators , um ihn als Null-Koaleszenzoperator zu verwenden, nicht intuitiv ist und tatsächlich in Codeform stumpf aussieht. Wo es nützlich wird, ist, wenn Sie versuchen, boolesche Mathematik zu tun.function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
Sie haben Recht, das
||=
ist ein nützliches Konstrukt. Es existiert in Perl.Tatsächlich stellt Perl all diese zur Verfügung:
Einige davon sind großartig (
.=
fügt etwas an das Ende eines Strings an), andere weniger (&&=
ich nehme an, die Variable würde auf die rechte Seite gesetzt, wenn sowohl sie als auch die Variable wahr sind. Aber warum sollten Sie das jemals tun? ?)Was in einer Sprache enthalten ist, ist wirklich ein Merkmal ihrer Designphilosophie.
quelle
&&=
bedeutet / tut.