var없이 객체 분해


97

var앞에 키워드 가없는 경우 객체 구조화에서 오류가 발생하는 이유는 무엇 입니까?

{a, b} = {a: 1, b: 2};

던지다 SyntaxError: expected expression, got '='

다음 세 가지 예는 문제없이 작동합니다.

var {a, b} = {a: 1, b: 2};
var [c, d] = [1, 2];
    [e, f] = [1, 2];

보너스 질문 : 왜 var배열 분해를 위해 필요하지 않습니까?

나는 같은 일을하는 문제에 부딪쳤다.

function () {
  var {a, b} = objectReturningFunction();

  // Now a and b are local variables in the function, right?
  // So why can't I assign values to them?

  {a, b} = objectReturningFunction();
}

답변:


158

이 문제 {...}는 JavaScript에서 여러 의미를 갖는 연산자 로 인해 발생 합니다.

때, {a의 시작 부분에 나타납니다 성명 , 그것은 항상 표현 것이다 블록 에 할당 할 수 없습니다. 나중에 Statement 에서 Expression 으로 나타나는 경우 표시되면 Object를 나타냅니다.

var다음 과 같이 그룹화 괄호 처럼 Statement 뒤에 올 수 없기 때문에이 구분을 하는 데 도움이 됩니다 .

( {a, b} = objectReturningFunction() );

문서에서 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Assignment_without_declaration

참고 : 선언없이 객체 리터럴 비 구조화 할당을 사용할 때 할당 문 주위의 괄호 (...)가 필요합니다.

{a, b} = {a : 1, b : 2}는 유효한 독립형 구문이 아닙니다. 왼쪽의 {a, b}는 개체 리터럴이 아닌 블록으로 간주되기 때문입니다.

그러나 ({a, b} = {a : 1, b : 2})는 유효하며 var {a, b} = {a : 1, b : 2}

(...) 표현식 앞에 세미콜론이 와야하거나 이전 행에서 함수를 실행하는 데 사용될 수 있습니다.


나중에 Statement에서 Expression으로 나타나면 Object를 나타냅니다. 이것은 우리가 그룹화 괄호 안에 블록 범위를 가질 수 없어 의미 하는가
sharad_kalya

그룹화 괄호 팁은 훌륭한 것입니다.
James Smith

이것은 나를 당황하게 한 놀랍도록 모호한 지식입니다. 범위 전체에 걸쳐 구조화를 허용합니다 (물론 변수를 선언해야합니다). 그러나 Promise 체인의 한 단계에서 해결 된 여러 변수를 다른 단계에서 해결 된 여러 변수를 너무 복잡하게 만들지 않고 사용해야하는 동시에 Promise 체인을 사용하는 제약을 해결합니다. 감사.
Kevin Teljeur 2018 년

22

세미콜론없이 자바 스크립트를 작성하는 경우 예상대로 작동하려면 '선언없는 할당'구문 앞에 세미콜론이 있어야합니다.

let a, b

;({a, b} = objectReturningFunction()) // <-- note the preceding ;

나를 잡았을 때 이것을 강조하고 싶었고 다른 사람들이 왜 작동하지 않는지 및 / 또는 다음과 같은 코드 포맷터로 이상한 결과를 생성하는 데 시간을 절약 할 수 있기를 바랍니다. prettier .

실제로 받아 들여진 답변 (인용 된 문서의 마지막 줄)에 실제로 있지만 놓치기 쉽습니다. 특히 예제를 보지 않고는 그렇습니다!


1
네. 사람들이 세미콜론을 사용하는 이유!
jfriend00

0

다른 방법이 있습니다.

let {} = {a, b} = objectReturningFunction()

장점 :

  • 괄호가 필요하지 않습니다.
  • 세미콜론이 필요하지 않습니다.
  • 추가 할당은 보장 된 no-op입니다 (이상한 일이 진행되지 않는 경우)

단점 :

  • 제 생각에는 !(){...}() IIFE 보다 이상하지 않지만 조금 이상해 보입니다 .
  • 왜 거기에 있는지 혼란 스러울 수 있습니다. 첫 만남에서 사람들을 쫓아내는 것이 보장되므로 일회성으로 사용하지 않는 것이 좋습니다.

IIFE와 같은 느낌 ;({ a, b })let {} = { ... }. 그래도 좋은 속임수. :)
shuckster

@ proto-n, +1, 아주 똑똑한 아이디어. 이것을 어떻게 알게 되었습니까?
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.