JavaScript를 사용한 다중 왼손 할당


186
var var1 = 1,
    var2 = 1,
    var3 = 1;

이것은 이것과 같습니다 :

var var1 = var2 = var3 = 1;

변수가 정의 된 순서 인 var3, var2, var1이라고 확신합니다. 이는 다음과 같습니다.

var var3 = 1, var2 = var3, var1 = var2;

JavaScript로 이것을 확인할 수있는 방법이 있습니까? 일부 프로파일 러를 사용하고 있습니까?



내가 사용하는 경우에도 적용 this.var1 = this.var2 = this.var3 = 1됩니까?
Gangadhar JANNU

답변:


404

사실은,

var var1 = 1, var2 = 1, var3 = 1;

다음 과 동일 하지 않습니다 .

var var1 = var2 = var3 = 1;

차이점은 범위 지정에 있습니다.

function good() {
  var var1 = 1, var2 = 1, var3 = 1;
}

function bad() {
  var var1 = var2 = var3 = 1;
}

good();
console.log(window.var2); // undefined

bad();
console.log(window.var2); // 1. Aggh!

실제로 이것은 과제가 올바른 연관성을 보여줍니다. bad예는 동등하다 :

var var1 = (window.var2 = (window.var3 = 1));

44
댕, 예상치 못한 일이야 팁 주셔서 감사합니다, 나는 그것을 조심할 것입니다.
David Calhoun

10
@ SkinnyG33k는 오른쪽에서 왼쪽이기 때문에. 가장 왼쪽에서 가장 오른쪽을 구문 분석합니다. 그래서 var var1=var2이후에 발생 var3 = 1후에 var2 = var3. 그것은처럼var3=1; var2=var3; var var1=var2
GCB

12
참고 : 이러한 종류의 작업을 미리 수행하려는 경우 할당에서 정의를 분리 할 수 ​​있습니다. 그래서 : var v1, v2, v3;나중에 : v1 = v2 = v3 = 6;그들은 여전히 ​​지역 범위에있을 것입니다. 다윗이 경고를 언급 한 이후,이 같이 (사전 var'd 경우) 예상 작동합니다 :alert(v1 = v2 = v3 = 6);
ShawnFumo

3
바로 그거죠. 그러나 일반적인 모범 사례를 따르면이 경우 상단에 변수를 선언하여 원치 않는 실수를 피하고 지역 변수가 전역 범위로 누출되는 것을 피할 수 있습니다. 참조 : jsfiddle.net/gleezer/r9Mu8/1
Nobita

1
"Dang, 그건 예기치 않은 일이다." 왜 이것이 예상치 못한 것입니까? 대부분의 언어는 사용하기 전에 변수를 선언해야합니다. JavaScript는 다르지 않습니다. 변수 선언을 무시하면 전역 창 개체로 기본 설정됩니다. 자바 스크립트에서 '엄격한 사용'을 사용하면 더 나은 JavaScript 프로그래머가됩니다.
cchamberlain

20

자바 스크립트의 할당은 오른쪽에서 왼쪽으로 작동합니다. var var1 = var2 = var3 = 1;.

이러한 변수 중 하나의 값 1이이 명령문 다음에 오는 경우 논리적으로 오른쪽에서 시작 했어야합니다. 그렇지 않으면 값 또는 var1var2정의되지 않은 것입니다.

var var1 = (var2 = (var3 = 1));가장 내부의 괄호 세트가 먼저 평가되는 위치 와 동등한 것으로 생각할 수 있습니다 .


1
고마워, 이것은 확실히 도움이됩니다. 오른쪽에서 왼쪽이 아닌 다른 것으로 평가 된 경우 어떤 오류가 발생할지 생각하는 데 도움이됩니다 (이 경우 var1 / var2가 정의되지 않은 경우 오류가 발생 함).
David Calhoun

5
실제로 구문 오류입니다. 당신은 (직후에 가질 수 없습니다 var. 외부 괄호 세트를 제거하면 오류없이 컴파일 할 수 있습니다 var var1 = (var2 = (var3 = 1));. 당시 나는 그것이 요점을 잘 설명하지 못한다고 느꼈지만 나는 그 점을 동일하게 생각한다.
저스틴 존슨

var var1 = var2 = var3 = 1;. 동일은 var var3 = 1; var var2 = var3; var var1 = var2;
xgqfrms

8

var var1 = 1, var2 = 1, var3 = 1;

이 경우 var키워드는 세 변수 모두에 적용됩니다.

var var1 = 1,
    var2 = 1,
    var3 = 1;

이것은 이것과 동등하지 않습니다 :

var var1 = var2 = var3 = 1;

이 경우 screens 뒤에 var키워드는 var1변수 게양으로 만 적용 되며 나머지 표현식은 정상적으로 평가되므로 변수 var2, var3전역 변수가됩니다.

Javascript는이 코드를 다음 순서로 처리합니다.

/*
var 1 is local to the particular scope because of var keyword
var2 and var3 will become globals because they've used without var keyword
*/

var var1;   //only variable declarations will be hoisted.

var1= var2= var3 = 1; 

8
a = (b = 'string is truthy'); // b gets string; a gets b, which is a primitive (copy)
a = (b = { c: 'yes' }); // they point to the same object; a === b (not a copy)

(a && b)논리적으로 (a ? b : a)곱셈 같은 동작합니다 (예. !!a * !!b)

(a || b)논리적으로 (a ? a : b)그리고 또한 같은 동작합니다 (예. !!a + !!b)

(a = 0, b)a진실하고 암묵적으로 돌아온 다면 돌보지 않기로 짧다b


a = (b = 0) && "nope, but a is 0 and b is 0"; // b is falsey + order of operations
a = (b = "b is this string") && "a gets this string"; // b is truthy + order of ops

JavaScript 연산자 우선 순위 (작업 순서)

쉼표 연산자는 실제로 가장 권한이 적은 연산자이지만 괄호가 가장 권한이 높으며 한 줄 식을 만들 때 직접 사용됩니다.


결국, 하드 코딩 된 값보다는 '썽크'가 필요할 수 있으며, 나에게 썽 크는 함수와 결과 값 (동일한 '사물')입니다.

const windowInnerHeight = () => 0.8 * window.innerHeight; // a thunk

windowInnerHeight(); // a thunk

4

이 시도:

var var1=42;
var var2;

alert(var2 = var1); //show result of assignment expression is assigned value
alert(var2); // show assignment did occur.

첫 번째 경고에서 단일 '='에 유의하십시오. 할당 식의 결과가 할당 된 값임을 나타내고 두 번째 경고는 할당이 발생했음을 나타냅니다.

논리적으로 할당은 오른쪽에서 왼쪽으로 연결되어야합니다. 그러나 이것은 자바 스크립트 (스레딩이 없음)의 모든 원자이므로 특정 엔진은 실제로 약간 다르게 최적화하도록 선택할 수 있습니다.


1
답변 해주셔서 감사합니다. 다중 할당 구조 (a = b = c)를 계속 유지하면서 경고를 사용하는 방법을 찾고 있었지만 가능하지 않다고 생각합니다.
David Calhoun

1
자바 스크립트에서와 같은 개별 문장 (및 여러 표현식이 모두 단일 문장으로 작동 함)은 원 자성으로 간주 될 수 있습니다. 당신은 그것을 분해해야합니다.
Joel Coehoorn

1

지금까지는 동일하지 않다는 것이 분명합니다. 코드를 작성하는 방법

var var1, var2, var3
var1 = var2 = var3 = 1

그리고 어떻습니까? var와 정확히 동일하므로 블록 범위로 인해 어설 션을 혼동하지 마십시오.

let var1 = var2 = 1 // here var2 belong to the global scope

우리는 다음을 할 수 있습니다.

let v1, v2, v3
v1 = v2 = v3 = 2

참고 : btw, 같은 줄에 여러 선언을 사용하지 말고 여러 할당을 사용하지 않는 것이 좋습니다.


-3

coffee-script aplomb으로 이것을 달성 할 수 있습니다 ..

for x in [ 'a', 'b', 'c' ] then "#{x}" : true

[ { a: true }, { b: true }, { c: true } ]


7
이것은 실제로 질문에 대답하지 않습니다. 질문을 다시 읽으십시오.
Martin

30
누가 커피 스크립트에 대한 관심
neaumusic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.