在Javascript中将多个变量分配给相同的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Javascript中将多个变量分配给相同的值相关的知识,希望对你有一定的参考价值。
我在javascript文件中初始化了全局范围内的几个变量:
var moveUp, moveDown, moveLeft, moveRight;
var mouseDown, touchDown;
我需要将所有这些变量设置为false,这是我目前拥有的代码:
moveUp = false;
moveDown = false;
moveLeft = false;
moveRight = false
mouseDown = false;
touchDown = false;
有什么方法可以将所有这些变量设置为一行代码中的相同值,或者我现在有最好的方法来执行此操作的代码
没有什么能阻止你做
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
。如果您处于不同的环境中,这些变量将附加到该环境的全局上下文(即,在Node.js中,它将附加到global
,这是该环境的全局上下文)。
现在,您可以先声明所有变量,然后将它们分配给相同的值,这样就可以避免出现问题。
var moveUp, moveDown, moveLeft, moveRight, mouseDown, touchDown;
moveUp = moveDown = moveLeft = moveRight = mouseDown = touchDown = false;
长话短说,两种方式都可以正常工作,但第一种方式可能会在您的代码中引入一些有害的错误。如果不是绝对必要的话,不要犯下使用局部变量乱丢全局命名空间的罪。
旁注:正如评论中指出的那样(这不仅仅是在这个问题的情况下),如果复制的值不是原始值而是对象,您最好知道按值复制与按引用复制。每当分配对象时,都会复制对象的引用而不是实际对象。所有变量仍将指向同一个对象,因此一个变量中的任何更改都将反映在其他变量中,如果您的目的是复制对象值而不是引用,则会让您头疼。
在尝试将多个变量初始化为相同值时,还有另一个选项不会引入全局陷阱。是否优先考虑是一种判断。它可能会更慢,可能会或可能不会更具可读性。在您的具体情况下,我认为漫长的方式可能更具可读性和可维护性,并且速度更快。
另一种方式利用Destructuring assignment。
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, ' '));
将变量放在数组中并使用for循环将相同的值分配给多个变量。
myArray[moveUP, moveDown, moveLeft];
for(var i = 0; i < myArray.length; i++){
myArray[i] = true;
}
以上是关于在Javascript中将多个变量分配给相同的值的主要内容,如果未能解决你的问题,请参考以下文章
在 JSP 中将 JavaScript 变量分配给 Java 变量
如何在plsql中将对象类型属性的值分配给具有相同属性属性的不同对象类型?