присвоить нескольким переменным одно и то же значение в JavaScript



Я инициализировать несколько переменных в глобальной области видимости в JavaScript-файл:



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


мне нужно установить все эти переменные в false, это код, который у меня сейчас есть:



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


есть ли способ, которым я могу установить все эти переменные в одно и то же значение в одной строке кода, или это код, который у меня в настоящее время есть лучший способ сделать это

2209   4  

4 ответов:

ничто не мешает вам делать

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

этот

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

ничто не мешает вам делать выше, но держат!

есть несколько подводных камней. Назначение в Javascript происходит справа налево, поэтому, когда вы пишете:

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

он фактически переводится как:

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

которое фактически переводится как:

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

непреднамеренно, вы только что создали три 5 глобальных переменных-то, что я уверен, что вы не хотели делать.

Примечание: мой пример выше предполагает, что вы используете свой код в браузер, следовательно window. Если бы вы находились в другой среде, эти переменные присоединялись бы к любому глобальному контексту для этой среды (т. е. в узле.js, он будет прикрепляться к process который является глобальным контекстом для этой среды).

теперь вы можете сначала объявить все свои переменные, а затем присвоить им одно и то же значение, и вы можете избежать этой проблемы.

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

короче говоря, оба способа будут работать просто отлично, но первый способ потенциально могут возникнуть некоторые пагубные ошибки в вашем коде. Не совершайте грех засорения глобального пространства имен локальными переменными, если это не абсолютно необходимо.


Sidenote: как указано в комментариях (и это не только в случае этого вопроса), если копируемое значение было не примитивным значением, а вместо этого объектом, вам лучше знать о copy by value vs copy by reference. При назначении объектов ссылка на объект копируется вместо реального объекта. Все переменные будут указывать на один и тот же объект, так что любое изменение в одной переменной будут отражены в других переменных и вызовет у вас головную боль, если вы хотите скопировать значения объекта, а не ссылка.

есть еще один вариант, который не вводит глобальные gotchas при попытке инициализировать несколько переменных в одно и то же значение. Является ли это предпочтительным для долгого пути-это вызов суждения. Скорее всего, он будет медленнее и может быть или не быть более читаемым. В вашем конкретном случае я думаю, что длинный путь, вероятно, более читаем и обслуживаем, а также быстрее.

The другое способ использует Деструктурируется задание.

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

Это позволяет инициализировать набор var,let или const переменные с одинаковым значением в одной строке все с той же ожидаемой областью.

ссылки:

поместите переменную в массив и используйте цикл for, чтобы присвоить одно и то же значение нескольким переменным.

  myArray[moveUP, moveDown, moveLeft];

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

        myArray[i] = true;

    }

Comments

    Ничего не найдено.