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
모두 같은 예상 범위로 한 줄에 같은 값으로 변수를.
참고 문헌 :
-
MDN : 배열 전역 객체
-
MDN : Array.fill
답변
변수를 배열에 넣고 for 루프를 사용하여 동일한 값을 여러 변수에 할당하십시오.
myArray[moveUP, moveDown, moveLeft];
for(var i = 0; i < myArray.length; i++){
myArray[i] = true;
}