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이이 명령문 다음에 오는 경우 논리적으로 오른쪽에서 시작 했어야합니다. 그렇지 않으면 값 또는 var1및 var2정의되지 않은 것입니다.

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.