Weisen Sie demselben Wert in Javascript mehrere Variablen zu

177

Ich habe mehrere Variablen im globalen Bereich in einer JavaScript-Datei initialisiert:

var moveUp, moveDown, moveLeft, moveRight;
var mouseDown, touchDown;

Ich muss alle diese Variablen auf false setzen. Dies ist der Code, den ich derzeit habe:

moveUp    = false;
moveDown  = false;
moveLeft  = false;
moveRight = false
mouseDown = false;
touchDown = false;

Gibt es eine Möglichkeit, alle diese Variablen in einer Codezeile auf den gleichen Wert zu setzen, oder gibt es den Code, für den ich derzeit die beste Möglichkeit habe?

SUB-HDR
quelle
8
Alle Leser: Bitte sehen Sie sich die zweite Antwort unten an, bevor Sie sich entschieden haben, die Top-Antwort in Ihren Code zu implementieren. Frieden.
Govind Rai
Versuchen Sie nicht, dies zu tun, da im Speicher nur eine Variable und die anderen eine Kopie oder Referenz für diese Variable sind. Wenn Sie den Wert von eins ändern, sind alle davon betroffen
Lucas Matos
@ LucasMatos Nicht für Grundelemente.
Dave Newton

Antworten:

290

Nichts hindert dich daran

moveUp = moveDown = moveLeft = moveRight = mouseDown = touchDown = false;

Überprüfen Sie dieses Beispiel

var a, b, c;
a = b = c = 10;
console.log(a + b + c)

karthikr
quelle
13
Möglicherweise möchten Sie kommentieren, wie sich das Verhalten von primitiven Typen und Referenztypen unterscheidet, wenn Sie Werte wie von Ihnen vorgeschlagen zuweisen.
Steven Wexler
26
Ja, wenn Sie dies mit einem Objekt tun, sind alle Variablen Aliase des Objekts. IE function MyObj(){this.x=1} var a,b; a = b = new MyObj(); ++a.xerhöht auch die b.xEigenschaft.
AlexMorley-Finch
27
Scoping-Probleme! stackoverflow.com/questions/1758576/…
doublejosh
4
Ich würde sagen, verwenden Sie diesen Ansatz nicht, wenn Sie nicht alle Variablen links von der Zuweisung global erfassen
Bürger conn
2
Wie @doublejosh sagte, gibt es Scoping-Probleme, die Sie nicht angesprochen haben.
Kstratis
90

Nichts hindert Sie daran, das oben Genannte zu tun, aber halten Sie!

Es gibt einige Fallstricke. Die Zuweisung in Javascript erfolgt von rechts nach links. Wenn Sie also schreiben:

var moveUp = moveDown = moveLeft = moveRight = mouseDown = touchDown = false;

es übersetzt effektiv zu:

var moveUp = (moveDown = (moveLeft = (moveRight = (mouseDown = (touchDown = false)))));

was effektiv übersetzt bedeutet:

var moveUp = (window.moveDown = (window.moveLeft = (window.moveRight = (window.mouseDown = (window.touchDown = false)))));

Sie haben versehentlich gerade 5 globale Variablen erstellt - etwas, von dem ich mir ziemlich sicher bin, dass Sie es nicht wollten.

Hinweis: In meinem obigen Beispiel wird davon ausgegangen, dass Sie Ihren Code im Browser ausführen window. Wenn Sie sich in einer anderen Umgebung befinden, werden diese Variablen an den globalen Kontext für diese Umgebung angehängt (dh in Node.js globalwird an den globalen Kontext für diese Umgebung angehängt).

Jetzt können Sie zuerst alle Ihre Variablen deklarieren und sie dann demselben Wert zuweisen, um das Problem zu vermeiden.

var moveUp, moveDown, moveLeft, moveRight, mouseDown, touchDown;
moveUp = moveDown = moveLeft = moveRight = mouseDown = touchDown = false;

Kurz gesagt, beide Wege würden gut funktionieren, aber der erste Weg könnte möglicherweise einige schädliche Fehler in Ihren Code einbringen. Begehen Sie nicht die Sünde, den globalen Namespace mit lokalen Variablen zu verunreinigen, wenn dies nicht unbedingt erforderlich ist.


Nebenbemerkung: Wie in den Kommentaren ausgeführt (und dies gilt nicht nur für diese Frage), sollten Sie besser wissen, ob es sich bei dem fraglichen kopierten Wert um einen primitiven Wert, sondern um ein Objekt handelt. Bei der Zuweisung von Objekten wird der Verweis auf das Objekt anstelle des eigentlichen Objekts kopiert. Alle Variablen verweisen weiterhin auf dasselbe Objekt, sodass sich jede Änderung an einer Variablen in den anderen Variablen widerspiegelt und Ihnen große Kopfschmerzen bereitet, wenn Sie die Objektwerte und nicht die Referenz kopieren möchten.

Govind Rai
quelle
2
Was ist, wenn wir dasselbe mit let machen?
P-RAD
Abgesehen moveUpdavon, dass es sich um ein Block-Scoping handelt, würde es keinen Unterschied machen. Es würden noch 5 globale Variablen deklariert.
Govind Rai
1
@ GovindRai unterscheidet var a, b, c; a = b = c = 10;sich sehr von var a = b = c = 10;. Die akzeptierte Antwort ist also richtig. Sie sprechen ein Problem an, das nicht mit der akzeptierten Antwort zusammenhängt.
Elis Byberi
1
@ ElisByberi Danke für deinen Kommentar. Du liegst nicht falsch. Das Ziel meiner Antwort war es, den ersten Satz in der akzeptierten Antwort anzusprechen. Ich habe diesbezüglich weitere Klarheit in meiner Antwort gegeben.
Govind Rai
1
@ P-RAD Nur die erste mit let deklarierte Variable ist im umschließenden Bereich vorhanden.
Uday Hiwarale
9

Es gibt eine andere Option, die keine globalen Fallstricke einführt, wenn versucht wird, mehrere Variablen mit demselben Wert zu initialisieren. Ob es dem langen Weg vorzuziehen ist oder nicht, ist eine Entscheidung. Es wird wahrscheinlich langsamer sein und kann besser lesbar sein oder auch nicht. In Ihrem speziellen Fall denke ich, dass der lange Weg wahrscheinlich besser lesbar und wartbar sowie schneller ist.

Der andere Weg nutzt die Destrukturierungszuweisung .

let [moveUp, moveDown,
     moveLeft, moveRight,
     mouseDown, touchDown] = Array(6).fill(false);

console.log(JSON.stringify({
    moveUp, moveDown,
    moveLeft, moveRight,
    mouseDown, touchDown
}, null, '  '));

// NOTE: If you want to do this with objects, you would be safer doing this
let [obj1, obj2, obj3] = Array(3).fill(null).map(() => ({}));
console.log(JSON.stringify({
    obj1, obj2, obj3
}, null, '  '));
// So that each array element is a unique object

// Or another cool trick would be to use an infinite generator
let [a, b, c, d] = (function*() { while (true) yield {x: 0, y: 0} })();
console.log(JSON.stringify({
    a, b, c, d
}, null, '  '));

// Or generic fixed generator function
function* nTimes(n, f) {
    for(let i = 0; i < n; i++) {
        yield f();
    }
}
let [p1, p2, p3] = [...nTimes(3, () => ({ x: 0, y: 0 }))];
console.log(JSON.stringify({
    p1, p2, p3
}, null, '  '));

Auf diese Weise können Sie eine Reihe von initialisieren var, letoder constVariablen auf den gleichen Wert in einer Zeile alle mit dem gleichen erwarteten Umfang.

Verweise:

Doug Coburn
quelle
1
Passen Sie jedoch auf. Wenn Sie mit dieser Methode mehreren Variablen Objekte, Funktionen oder Arrays zuweisen, ist jede Variable ein Alias ​​für das sameObjekt. Änderungen an einem wirken sich auf die anderen aus ...
Doug Coburn
-6

Fügen Sie die Variable in ein Array ein und verwenden Sie eine for-Schleife, um mehreren Variablen denselben Wert zuzuweisen.

  myArray[moveUP, moveDown, moveLeft];

    for(var i = 0; i < myArray.length; i++){

        myArray[i] = true;

    }
Tohamas Brewster
quelle
3
Dies ist sehr falsch. Die erste Anweisung ist syntaktisch nicht sinnvoll und die for-Schleife weist den myArray-Indizes lediglich Werte zu.
undefinederror