var var1 = 1,
var2 = 1,
var3 = 1;
Dies entspricht:
var var1 = var2 = var3 = 1;
Ich bin mir ziemlich sicher, dass dies die Reihenfolge ist, in der die Variablen definiert sind: var3, var2, var1, was dem entspricht:
var var3 = 1, var2 = var3, var1 = var2;
Gibt es eine Möglichkeit, dies in JavaScript zu bestätigen? Verwenden Sie möglicherweise einen Profiler?
javascript
variables
variable-assignment
David Calhoun
quelle
quelle
this.var1 = this.var2 = this.var3 = 1
?Antworten:
Tatsächlich,
ist nicht gleichbedeutend mit:
Der Unterschied liegt im Umfang:
Tatsächlich zeigt dies, dass die Zuordnung richtig assoziativ ist. Das
bad
Beispiel entspricht:quelle
var var1=var2
passiert nachvar3 = 1
und nachvar2 = var3
. Es ist wievar3=1; var2=var3; var var1=var2
var v1, v2, v3;
Dann später:v1 = v2 = v3 = 6;
Sie werden immer noch im lokalen Bereich sein. Da David Warnungen erwähnte, würde dies wie erwartet funktionieren (wenn vorab geändert):alert(v1 = v2 = v3 = 6);
Die Zuweisung in Javascript funktioniert von rechts nach links.
var var1 = var2 = var3 = 1;
.Wenn der Wert einer dieser Variablen
1
nach dieser Anweisung liegt, muss sie logischerweise von rechts begonnen haben, andernfalls wäre der Wert odervar1
undvar2
undefiniert.Sie können sich das als äquivalent dazu vorstellen,
var var1 = (var2 = (var3 = 1));
wo der innerste Satz von Klammern zuerst ausgewertet wird.quelle
(
sofort danach habenvar
. Durch Entfernen des äußeren Satzes von Klammern kann dieser fehlerfrei kompiliert werdenvar var1 = (var2 = (var3 = 1));
. Zu der Zeit hatte ich das Gefühl, dass es den Punkt nicht ganz so gut illustrierte, aber ich nehme an, es ist das gleiche.var var1 = var2 = var3 = 1;.
gleichvar var3 = 1; var var2 = var3; var var1 = var2;
In diesem Fall gilt das
var
Schlüsselwort für alle drei Variablen.was nicht gleichbedeutend ist mit:
In diesem Fall hinter den Bildschirmen
var
Schlüsselwort nur anwendbar ist ,var1
um variable Hebe fällig und des Ausdrucks ruhen normalerweise ausgewertet wird , so dass die Variablenvar2, var3
immer GlobalsJavascript behandelt diesen Code in dieser Reihenfolge:
quelle
(a && b)
ist logisch(a ? b : a)
und verhält sich wie Multiplikation (zB!!a * !!b
)(a || b)
ist logisch(a ? a : b)
und verhält sich wie Addition (zB!!a + !!b
)(a = 0, b)
ist kurz dafür, sich nichta
darum zu kümmern, ob es wahr ist, implizit zurückzukehrenb
Vorrang des JavaScript-Operators (Reihenfolge der Operationen)
Beachten Sie, dass der Kommaoperator tatsächlich der am wenigsten privilegierte Operator ist, Klammern jedoch die am meisten privilegierten und beim Erstellen einzeiliger Ausdrücke Hand in Hand gehen.
Möglicherweise benötigen Sie eher "Thunks" als fest codierte Werte, und für mich ist ein Thunk sowohl die Funktion als auch der resultierende Wert (dasselbe "Ding").
quelle
Versuche dies:
Beachten Sie das einzelne '=' in der ersten Warnung. Dies zeigt, dass das Ergebnis eines Zuweisungsausdrucks der zugewiesene Wert ist, und die zweite Warnung zeigt an, dass eine Zuweisung stattgefunden hat.
Daraus folgt logischerweise, dass die Zuordnung von rechts nach links verkettet sein muss. Da dies jedoch alles atomar für das Javascript ist (es gibt kein Threading), kann eine bestimmte Engine entscheiden, es tatsächlich ein wenig anders zu optimieren.
quelle
Inzwischen ist klar, dass sie nicht gleich sind. Der Weg zum Code ist
Und was ist mit der Zuweisung? Genau wie bei var, lassen Sie sich von der let-Zuweisung nicht aufgrund des Blockumfangs verwirren.
Wir könnten Folgendes tun:
Hinweis: Übrigens empfehle ich nicht, mehrere Zuweisungen zu verwenden, nicht einmal mehrere Deklarationen in derselben Zeile.
quelle
coffee-script
kann dies mit Gelassenheit erreichen ..quelle