Pregunta Asignar múltiples variables al mismo valor en Javascript


Inicialicé varias variables en el alcance global en un archivo JavaScript:

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

Necesito configurar todas estas variables en falso, este es el código que tengo actualmente:

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

¿Hay alguna manera de que pueda establecer todas estas variables con el mismo valor en una línea de código, o es el código que actualmente tengo la mejor manera de hacerlo?


107
2018-06-07 02:30


origen


Respuestas:


Nada te impide hacer

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

Mira este ejemplo

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


188
2018-06-07 02:32



Nada te impide hacer lo anterior, ¡pero espera!

Hay algunos errores. La asignación en Javascript es de derecha a izquierda, así que cuando escriba:

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

efectivamente se traduce a:

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

que efectivamente se traduce a:

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

Inadvertidamente, acaba de crear tres 5 variables globales, algo que estoy bastante seguro de que no quería hacer.

Nota: El ejemplo anterior asume que está ejecutando su código en el navegador, por lo tanto, window. Si estuvieras en un entorno diferente, estas variables se vincularían a lo que sea que el contexto global sea para ese entorno (es decir, en Node.js, se adjuntaría a process cuál es el contexto global para ese entorno).

En resumen, deberías mantenerte en el largo camino. Es feo, hay más caracteres para escribir, pero al menos no cometerás el pecado de saturar el espacio de nombres global sin una buena razón y obtendrás extrañas miradas de otras personas (jk).

Además, como se señala en los comentarios (y esto no es solo en el caso de esta pregunta), al asignar objetos, la referencia al objeto se copia en lugar del objeto real. Ambas variables seguirán apuntando al mismo objeto, por lo que cualquier cambio en una variable se reflejará en la otra variable y anulará el objetivo final.


29
2017-08-14 02:31



Hay otra opción que no introduce errores globales al intentar inicializar múltiples variables con el mismo valor. Si es preferible al largo camino es una decisión de juicio. Es probable que sea más lento y puede o no ser más legible. En su caso específico, creo que el camino más largo es probablemente más legible y fácil de mantener, además de ser más rápido.

los otro forma utiliza Asignación de desestructuración.

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, '  '));

Esto le permite inicializar un conjunto de var, let, o const variables con el mismo valor en una sola línea, todas con el mismo alcance esperado.

Referencias


2
2017-09-17 21:10