在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中,它将附加到该process ,该process是该环境的全局上下文)。

长话短说,你应该坚持很长的路。 这很丑陋,还有更多的角色需要输入,但至少你不会犯任何没有任何理由的混乱的全球名字空间的罪行,并从其他人那里得到奇怪的注意(jk)。

另外,正如在注释中指出的那样(并且这不仅仅是这个问题的情况),每当分配对象时,对该对象的引用被复制而不是实际的对象。 这两个变量仍然会指向同一个对象,因此一个变量中的任何变化都会反映在另一个变量中,并且会影响您的最终目标。


还有另一个选项,当试图将多个变量初始化为相同的值时,不会引入全局陷阱。 一个判断的呼声,是不是长久以来最好。 它可能会更慢,可能会或可能不会更具可读性。 在你的具体情况下,我认为漫长的道路可能更具可读性和可维护性,并且速度更快。

另一种方式利用解构分配。

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, '  '));
链接地址: http://www.djcxy.com/p/69977.html

上一篇: assign multiple variables to the same value in Javascript

下一篇: Advice on Javascript variable initialization