Saltar al contenido

asignar múltiples variables al mismo valor en Javascript

Siéntete libre de compartir nuestro sitio y códigos con tus amigos, necesitamos de tu ayuda para aumentar nuestra comunidad.

Solución:

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)

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.

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.

los otro utiliza la 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:

  • MDN: objeto global de matriz

  • MDN: Matriz.llenar

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *