javascript - w3schools - wr schools



Warum ist diese Zuordnung links ungültig? (3)

Der Ausdruck b1 = !b2 = true; wird von rechts nach links ausgewertet

Erstens !b2 = true

dann: b1 = <result of previous assignment>

!b2 = true ergibt keinen logischen Sinn und daher der Fehler.

Wenn Sie schreiben b1 = b2 = true; , es wird keinen solchen Fehler geben

https://code.i-harness.com

Warum kann ich folgende Operationen ausführen:

var b1, b2;

b1 = b2 = true;

document.write(b1," ", b2);
document.write("<br>");

b1 = !b2;

document.write(b1," ", b2);
document.write("<br>");

b1 = b2 = !true;

document.write(b1," ", b2);

Wenn ich jedoch die folgende Operation versuche, erhalte ich einen ReferenceError: invalid assignment left-hand side ?

var b1, b2;

b1 = !b2 = true;

document.write(b1," ", b2);

Es ist offensichtlich, dass ich das nicht kann, aber ich kann keine Erklärung dafür finden, warum ich das nicht kann. Das MDN-Entwicklerhandbuch für die Fehlerzustände:

Irgendwo gab es eine unerwartete Aufgabe. Dies kann beispielsweise auf eine Nichtübereinstimmung eines Zuweisungsoperators und eines Vergleichsoperators zurückzuführen sein. Während ein einzelnes "=" Zeichen einer Variablen einen Wert zuweist, vergleichen die Operatoren "==" oder "===" einen Wert.

Alle Zuweisungsoperatoren arbeiten wie bewiesen einzeln. Warum kann dies nicht zu einer einzelnen Operation / verketteten Zuweisung kombiniert werden?


Nur um die AST- Zuordnung zu rvalue zu erwähnen ( 1 ) ( 2 )

if (1 + 1 = 2)
 console.log("1 + 1 = 2");

var b1, b2;
b1 = !b2 = true;

zur Bestätigung wird der Ausdruck nie ausgewertet .


b1 = b2 = true;

ist äquivalent zu

b2 = true;
b1 = true;

Eine Zuweisung gibt den richtigen Operanden zurück . Es ist leicht in einer interaktiven Konsole (wie Chrome DevTools , NodeJS , jsc ) zu sehen. Siehe die Spezifikationsdetails in Andrews Antwort .

Und wenn Sie versuchen, b1 = !b2 = true; macht das Äquivalent keinen Sinn:

(!b2) = true; // true = true; causes the error.
b1 = b2;      // never evaluated.

Das liegt daran, dass die ! hat precedence vor dem Zuweisungsoperator = (!b2) .

Die Bestellung lautet:

  1. b2 ist undefined da es noch nicht initialisiert wurde.
  2. Dann ist !b2 === true wie !undefined === true , also wird !undefined === true true ,
  3. und dann erfolgt die Zuweisung, also true = true .

Sie können dafür sorgen, dass es wie erwartet funktioniert, indem Sie Klammern hinzufügen:

b1 = !(b2 = true);




language-lawyer