присвоить нескольким переменным одно и то же значение в JavaScript
Я инициализировать несколько переменных в глобальной области видимости в JavaScript-файл:
var moveUp, moveDown, moveLeft, moveRight;
var mouseDown, touchDown;
мне нужно установить все эти переменные в false, это код, который у меня сейчас есть:
moveUp = false;
moveDown = false;
moveLeft = false;
moveRight = false
mouseDown = false;
touchDown = false;
есть ли способ, которым я могу установить все эти переменные в одно и то же значение в одной строке кода, или это код, который у меня в настоящее время есть лучший способ сделать это
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