[javascript] var없이 객체 분해

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();
}



답변

이 문제 {...}는 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}

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


답변

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

let a, b

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

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

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


답변

다른 방법이 있습니다.

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

장점 :

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

단점 :

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

답변