[javascript] 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 할당을 .

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;

    }


답변