Javascript에서 여러 변수를 동일한 값에 할당


177

JavaScript 파일의 전역 범위에서 여러 변수를 초기화했습니다.

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

이 변수를 모두 false로 설정해야합니다. 이것은 현재 가지고있는 코드입니다.

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

한 줄의 코드에서 이러한 변수를 모두 동일한 값으로 설정할 수있는 방법이 있습니까? 또는 현재이 작업을 수행하는 가장 좋은 방법은 코드입니까


8
모든 독자 : 코드에 최고의 답변을 구현하기로 결정하기 전에 아래의 두 번째 답변을 확인하십시오. 평화.
Govind Rai

메모리에 하나의 변수 만 있고 다른 변수는 해당 변수에 대한 사본 또는 참조이므로이 작업을 시도하지 마십시오. 값을 변경하면 모두 영향을받습니다.
Lucas Matos

@LucasMatos 프리미티브 용이 아닙니다.
데이브 뉴턴

답변:


290

아무것도 당신을 방해하지 않습니다

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

이 예를 확인하십시오

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


13
제안하는 방식으로 값을 할당 할 때 동작이 기본 유형과 참조 유형이 어떻게 다른지 설명 할 수 있습니다.
Steven Wexler 2016 년

26
예, 객체 로이 작업을 수행하면 모든 변수가 객체의 별칭이됩니다. IE function MyObj(){this.x=1} var a,b; a = b = new MyObj(); ++a.x는 또한 b.x속성을 증가시킵니다 .
AlexMorley-Finch


4
당신은 세계적으로 할당의 왼쪽에 모든 변수 범위를 지정하지 않으면 나는이 방법을 사용하지 말 것
코네티컷 시민을

2
@doublejosh가 말했듯이, 해결하지 못한 범위 지정 문제가 있습니다.
kstratis

90

아무것도 당신이 위의 일을 막을 수는 없지만 견디십시오!

몇 가지 문제가 있습니다. 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;

간단히 말해 두 가지 방법 모두 잘 작동하지만 첫 번째 방법은 잠재적으로 코드에 치명적인 버그를 일으킬 수 있습니다. 절대적으로 필요하지 않은 경우 전역 변수를 로컬 변수로 버리는 죄를 저 지르지 마십시오.


주석 : 주석에서 지적했듯이 (이 질문의 경우에만 해당되는 것이 아님), 문제의 복사 된 값이 기본 값이 아니라 객체 인 경우 값별 복사 대 참조 별 복사에 대해 더 잘 알고 있습니다. 객체를 할당 할 때마다 실제 객체 대신 객체에 대한 참조가 복사됩니다. 모든 변수는 여전히 동일한 객체를 가리 키므로 한 변수의 변경 사항은 다른 변수에 반영되며 참조가 아닌 객체 값을 복사하려는 경우 큰 두통을 유발할 수 있습니다.


2
let과 똑같이하면 어떻게 될까요?
P-RAD

moveUp블록 범위가되는 것 외에도 아무런 차이가 없습니다. 5 개의 전역 변수가 여전히 선언됩니다.
Govind Rai

1
@GovindRai와는 var a, b, c; a = b = c = 10;매우 다릅니다 var a = b = c = 10;. 따라서 허용되는 답변이 맞습니다. 허용 된 답변과 관련이없는 문제를 해결하고 있습니다.
Elis Byberi

1
@ElisByberi 귀하의 의견에 감사드립니다. 당신은 틀리지 않습니다. 내 대답의 목표는 받아 들여진 대답의 첫 번째 문장을 다루는 것이 었습니다. 나는 그것에 대해 내 대답에 더 명확성을 제공했습니다.
Govind Rai

1
@ P-RAD let을 사용하여 선언 된 첫 번째 변수 만 둘러싸는 범위에 존재합니다.
Uday Hiwarale

9

여러 변수를 동일한 값으로 초기화하려고 할 때 전역 문제를 일으키지 않는 또 다른 옵션이 있습니다. 먼 길을 선호하는지 여부는 판단 요청입니다. 속도가 느릴 수 있고 더 읽기 쉬울 수도 있고 읽지 못할 수도 있습니다. 귀하의 특정 경우, 먼 길은 더 읽기 쉽고 유지 관리가 가능하고 빠를 것이라고 생각합니다.

다른 방법은 사용 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 모두 같은 예상 범위로 한 줄에 같은 값으로 변수를.

참고 문헌 :


1
그러나 조심하십시오. 이 방법을 사용하여 객체, 함수 또는 배열을 여러 변수에 할당하면 각 변수는 same객체 의 별칭이됩니다 . 하나의 수정은 다른 사람에게 영향을 미칠 것입니다 ...
Doug Coburn

-6

변수를 배열에 넣고 for 루프를 사용하여 동일한 값을 여러 변수에 할당하십시오.

  myArray[moveUP, moveDown, moveLeft];

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

        myArray[i] = true;

    }

3
첫 번째 문장은 구문 상 의미가 없으며 for 루프는 단지 myArray 인덱스에 값을 할당합니다.
undefinederror
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.