¿Asignar múltiples variables al mismo valor en Javascript?

7 minutos de lectura

He inicializado varias variables en el ámbito global en un archivo JavaScript:

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

Necesito establecer 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 forma de que pueda configurar todas estas variables con el mismo valor en una línea de código, o el código que tengo actualmente es la mejor manera de hacerlo?

  • Todos los lectores: vean la segunda respuesta a continuación antes de decidir implementar la respuesta principal en su código. Paz.

    – Govind Rai

    14 de agosto de 2017 a las 2:39


  • No intente hacer esto, porque en la memoria solo habrá una variable y las demás serán una copia o referencia para esa, luego, si cambia el valor de una, todas se verán afectadas.

    –Lucas Matos

    26 de febrero de 2019 a las 19:36

  • @LucasMatos No para primitivos.

    – David Newton

    18 de abril de 2020 a las 2:47


  • sé que no es la respuesta, pero usaría UNA variable “dirección” y en lugar de establecer una variable en falso, uso el triple = para compararlo con verdadero si (moveLeft === verdadero), de esa manera no lo hace necesita establecer el valor inicial en absoluto

    – Martijn Scheffer

    15 oct 2020 a las 19:15

avatar de usuario
govind rai

Nada te impide hacer lo anterior, ¡pero espera!

Hay algunas trampas. La asignación en Javascript es de derecha a izquierda, así que cuando escribes:

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

se traduce efectivamente a:

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

que se traduce efectivamente a:

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

Sin darse cuenta, acaba de crear 5 variables globales, algo que estoy bastante seguro de que no quería hacer.

Nota: mi ejemplo anterior asume que está ejecutando su código en el navegador, por lo tanto window. Si tuviera que estar en un entorno diferente, estas variables se adjuntarían a cualquier contexto global para ese entorno (es decir, en Node.js, se adjuntaría a global que es el contexto global para ese entorno).

Ahora podría declarar primero todas sus variables y luego asignarles el mismo valor y podría evitar el problema.

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

Para resumir, ambas formas funcionarían bien, pero la primera podría potencialmente introducir algunos errores perniciosos en su código. No cometa el pecado de ensuciar el espacio de nombres global con variables locales si no es absolutamente necesario.


Nota al margen: como se señaló en los comentarios (y esto no es solo en el caso de esta pregunta), si el valor copiado en cuestión no era un valor primitivo sino un objeto, es mejor que sepa sobre la copia por valor frente a la copia por referencia. Siempre que se asignan objetos, la referencia al objeto se copia en lugar del objeto real. Todas las variables seguirán apuntando al mismo objeto, por lo que cualquier cambio en una variable se reflejará en las otras variables y le causará un gran dolor de cabeza si su intención era copiar los valores del objeto y no la referencia.

  • ¿y si hacemos lo mismo con let?

    – P-RAD

    04/07/2018 a las 23:20

  • Además moveUp convirtiéndose en un bloque de alcance, no haría ninguna diferencia. Aún se declararían 5 variables globales.

    – Govind Rai

    5 de julio de 2018 a las 15:08

  • @GovindRai var a, b, c; a = b = c = 10; es muy diferente de var a = b = c = 10;. Entonces, la respuesta aceptada es correcta. Está abordando un problema que no está relacionado con la respuesta aceptada.

    – Elis Byberi

    16 de agosto de 2018 a las 17:16


  • @ElisByberi Gracias por tu comentario. Tu no estas equivocado. El objetivo de mi respuesta era abordar la primera oración en la respuesta aceptada. He proporcionado más claridad en mi respuesta con respecto a eso.

    – Govind Rai

    16 de agosto de 2018 a las 21:51

  • @P-RAD Solo la primera variable declarada usando let existirá en el ámbito adjunto.

    – Uday Hiwarale

    14 de julio de 2020 a las 8:31

  • bien, pero sigue siendo totalmente incorrecto asignar memoria solo para hacer una tarea.

    – Martijn Scheffer

    14 oct 2020 a las 18:22

  • Usar la desestructuración de matrices es un buen enfoque. También puede declarar una matriz y poner explícitamente sus valores allí, ya sean todos iguales o todos diferentes. let [moveUp, moveDown, moveLeft, ..., touchDown] = [1, False,..., True]

    – Joel Carneiro

    22 de diciembre de 2020 a las 20:38


avatar de usuario
doug coburn

Hay otra opción que no introduce fallos globales al intentar inicializar varias variables con el mismo valor. Si es o no preferible al camino largo es una cuestión de criterio. Probablemente será más lento y puede o no ser más legible. En su caso específico, creo que el camino largo es probablemente más legible y fácil de mantener, además de ser más rápido.

Él 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, leto const variables al mismo valor en una sola línea, todas con el mismo alcance esperado.

Referencias:

  • Sin embargo, tenga cuidado. Si asigna objetos, funciones o matrices a múltiples variables usando este método, cada variable será un alias para el same objeto. Las modificaciones a uno afectarán a los demás…

    –Doug Coburn

    9 oct 2017 a las 15:21


  • creando una matriz para asignar un valor, por favor no

    – Martijn Scheffer

    13 oct 2020 a las 17:06

  • @MartijnScheffer ¿por qué? Si el motor de JavaScript que compila el código realmente crea y descarta una matriz adicional de la que tendría al compilar una serie de asignaciones directas, sería específico de la implementación y reparable.

    –Doug Coburn

    13 oct 2020 a las 17:20

  • Sí, una vez que se compila el código, la matriz aún se crea, lo que hace que este método sea MUCHO más lento que simplemente asignar los valores. Eso no se puede arreglar, no asigne memoria si no es necesario. Simplemente haga una prueba simple, escriba un botín con ambas versiones del código.

    – Martijn Scheffer

    14 oct 2020 a las 18:11


  • “”Escriba JavaScript idiomático y déjenos preocuparnos por los bits de bajo nivel del rendimiento de JavaScript”” — Benedikt Meurer, experto en rendimiento de V8.

    –Doug Coburn

    15 oct 2020 a las 20:48

avatar de usuario
Tohamas Brewster

Coloque la variable en una matriz y use un bucle for para asignar el mismo valor a varias variables.

  myArray[moveUP, moveDown, moveLeft];

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

        myArray[i] = true;

    }

  • Sin embargo, tenga cuidado. Si asigna objetos, funciones o matrices a múltiples variables usando este método, cada variable será un alias para el same objeto. Las modificaciones a uno afectarán a los demás…

    –Doug Coburn

    9 oct 2017 a las 15:21


  • creando una matriz para asignar un valor, por favor no

    – Martijn Scheffer

    13 oct 2020 a las 17:06

  • @MartijnScheffer ¿por qué? Si el motor de JavaScript que compila el código realmente crea y descarta una matriz adicional de la que tendría al compilar una serie de asignaciones directas, sería específico de la implementación y reparable.

    –Doug Coburn

    13 oct 2020 a las 17:20

  • Sí, una vez que se compila el código, la matriz aún se crea, lo que hace que este método sea MUCHO más lento que simplemente asignar los valores. Eso no se puede arreglar, no asigne memoria si no es necesario. Simplemente haga una prueba simple, escriba un botín con ambas versiones del código.

    – Martijn Scheffer

    14 oct 2020 a las 18:11


  • “”Escriba JavaScript idiomático y déjenos preocuparnos por los bits de bajo nivel del rendimiento de JavaScript”” — Benedikt Meurer, experto en rendimiento de V8.

    –Doug Coburn

    15 oct 2020 a las 20:48

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad