[javascript] `var {…} =…`문에서 중괄호는 무엇을합니까?

이것이 Mozilla 특정 JS 구문인지 확실하지 않지만 예를 들어 애드온 SDK 문서 에서와 같이 이러한 방식으로 선언되는 변수를 종종 발견했습니다 .

var { Hotkey } = require("sdk/hotkeys");

다양한 크롬 Javascript에서 (대신 let문이 사용됩니다 var),

let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu }  = Components;

매우 혼란 스럽지만 MDN 에서도 두 구문에 대한 문서를 찾을 수 없습니다 .



답변

둘 다 JavaScript 1.7 기능입니다. 첫 번째는 블록 수준 변수입니다 .

let변수를 선언하고 변수가 사용되는 블록, 문 또는 표현식으로 범위를 제한 할 수 있습니다. 이것은 var변수를 전역 적으로 정의하거나 블록 범위에 관계없이 전체 함수에 대해 로컬로 정의하는 키워드 와는 다릅니다 .

두 번째는 Destructuring 이라고합니다 .

Destructuring 할당을 사용하면 배열 및 개체 리터럴의 구성을 미러링하는 구문을 사용하여 배열 또는 개체에서 데이터를 추출 할 수 있습니다.

디스트 럭처링 할당으로 할 수있는 특히 유용한 작업 중 하나는 다음 예제로 가득 찬 섹션에서 볼 수 있듯이 여러 가지 흥미로운 작업을 수행 할 수 있지만 단일 문에서 전체 구조를 읽는 것입니다.

Python에 익숙한 사용자에게는 다음 구문과 유사합니다.

>>> a, (b, c) = (1, (2, 3))
>>> a, b, c
(1, 2, 3)

첫 번째 코드 청크는 다음의 약칭입니다.

var {Hotkey: Hotkey} = require("sdk/hotkeys");
// Or
var Hotkey = require("sdk/hotkeys").Hotkey;

두 번째 코드 청크를 다음과 같이 다시 작성할 수 있습니다.

let Cc = Components.classes;
let Ci = Components.interfaces;
let Cr = Components.results;
let Cu = Components.utils;


답변

당신이보고있는 것은 비 구조화 과제입니다. Haskell과 같은 패턴 매칭 의 한 형태입니다 .

비 구조화 할당을 사용하면 객체 및 배열에서 값을 추출하고 객체 및 배열 리터럴 구문을 사용하여 새로 선언 된 변수에 할당 할 수 있습니다. 이것은 코드를 훨씬 더 간결하게 만듭니다.

예를 들면 :

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a, b, c} = ascii;

위의 코드는 다음과 같습니다.

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var a = ascii.a;
var b = ascii.b;
var c = ascii.c;

배열의 경우 :

var ascii = [97, 98, 99];

var [a, b, c] = ascii;

이것은 다음과 동일합니다.

var ascii = [97, 98, 99];

var a = ascii[0];
var b = ascii[1];
var c = ascii[2];

다음과 같이 객체 속성을 추출하고 이름을 바꿀 수도 있습니다.

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var {a: A, b: B, c: C} = ascii;

이것은 다음과 동일합니다.

var ascii = {
    a: 97,
    b: 98,
    c: 99
};

var A = ascii.a;
var B = ascii.b;
var C = ascii.c;

그게 전부입니다.


답변

이것은 Javascript의 파괴적인 할당이며 ES2015 표준의 일부입니다. 객체의 배열 또는 속성에서 고유 한 변수로 값을 압축 해제하거나 추출합니다. 예 : 배열 분해

var foo = ["one", "two", "three"];
//without destructuring
var one = foo[0];
var two = foo[1];
var three = foo[2];

// 비 구조화 var [one, two, three] = foo

예 : 객체 분해

var o = {p : 42, q : true}; var {p, q} = o;

console.log (p); // 42 console.log (q); // 진실

// 새 변수 이름 할당 var {p : foo, q : bar} = o;

console.log (foo); // 42 console.log (bar); // 진실


답변

letMDN에 대한 문서가 있습니다 : https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

letvar선언 된 변수의 범위를 제한한다는 점에서 유사 합니다. if(){}블록 (또는 다른 블록) 내에서 변수를 선언하고 해당 블록 내에서만 “표시”할 수 있습니다 (지금까지 자바 스크립트는 대부분의 다른 언어처럼 블록 범위가 아닌 함수 범위를 가짐). 그래서let 기본적으로 많은 사람들이 문제를 가지고있는 것에 대한 “수정”입니다. tihs는 JavaScript 1.7 기능입니다.

에서 아무것도 찾지 못했습니다 {Foo}.


답변