할당 왼쪽의 자바 스크립트 개체 대괄호 표기법 ({Navigation} =)


108

나는이 구문을 전에 본 적이 없으며 그것이 무엇에 관한 것인지 궁금합니다.

var { Navigation } = require('react-router');

왼쪽의 괄호는 구문 오류를 발생시킵니다.

예기치 않은 토큰 {

웹팩 구성의 어떤 부분이 변환되는지 또는 구문의 목적이 무엇인지 잘 모르겠습니다. 하모니인가요? 누군가 나를 깨달을 수 있습니까?


당신에 webpack.config.js당신은 아마이 jsx-loaderharmony플래그는 사용 가능
파올로 모레티에게

답변:


112

구조화 할당 이라고 하며 ES2015 표준 의 일부입니다 .

비 구조화 할당 구문은 배열 및 개체 리터럴의 구성을 미러링하는 구문을 사용하여 배열 또는 개체에서 데이터를 추출 할 수있게 해주는 JavaScript 식입니다.

출처 : MDN의 구조 분해 할당 참조

객체 분해

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

 console.log(p); // 42
 console.log(q); // true 

 // Assign new variable names
 var {p: foo, q: bar} = o;

 console.log(foo); // 42
 console.log(bar); // true

배열 분해

var foo = ["one", "two", "three"];

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

// with destructuring
var [one, two, three] = foo;

4
감사. 나는 이것을 받아들이고 다른 질문을 던질 것입니다. 이제 구문이 무엇인지 알았으므로 프로젝트에서 아직 컴파일되지 않는 것이 무엇인지 파악해야합니다.
captainill 2014

Webpack은 Esprima를 사용하며 Esprima 2.0이 게시되면 es6를 지원합니다 . 그때까지 es5로 컴파일하는 es6-loader 중 하나를 사용할 수 있습니다. github.com/conradz/esnext-loader github.com/Couto/6to5-loader github.com/shama/es6-loader
Johannes Ewald

2
이 솔루션은 솔루션에 표시되지 않은 그가 제시 한 예제를 해결하지 못했기 때문에이 솔루션을 비추천했습니다. 첫 번째 예제는 구조화되는 객체 리터럴을 보여줍니다. 두 번째는 구조화되고있는 어레이를 보여줍니다. 그러나 문제가되는 예는 다음과 같습니다. var {Navigation} = require ( 'react-router'); 또한 그가 준 예에서는 중괄호가 필요하지 않습니다.
AndroidDev

2
@AndroidDev 편집 제안을 환영합니다. OP는 확실히 만족스러운 대답을 찾은 것 같았습니다.
Matt Ball

1
왜 [이름 바꾸기]가 "뒤로"인지 아십니까? 즉, var {newVarName: oldVarName} = varSource;같은 많이 보인다 { newVarName: varSource.oldVarName }거나 scope.newVarName = varSource.oldVarName;,하지만 사람들은 분명히 잘못이다. 왼쪽에 기존 / 기존 이름이있는 실용적인 이유가 :있습니까?
ruffin

114

이것은 구조화 할당 입니다. ECMAScript 2015의 새로운 기능입니다.

var {
  AppRegistry,
  StyleSheet,
  Text,
  View,
} = React;

다음과 같습니다.

var AppRegistry = React.AppRegistry;
var StyleSheet = React.StyleSheet;
var Text = React.Text;
var View = React.View;

17
var { Navigation } = require('react-router');

... 비 구조화를 사용하여 ...

var Navigation = require('react-router').Navigation;

...하지만 훨씬 더 읽기 쉽습니다.


3
이것은 질문에 직접 대답하므로 먼저 읽는 것이 가장 좋은 대답 일 수 있지만 이전 대답 중 일부는 더 깊이 들어갑니다.
Mallory-Erik

3
더 간결하게 ... 네. 더 읽기 쉽습니다-실제로는 아닙니다. 후자의 예는보다 기본적인 구조를 사용하여보다 명시 적이므로 더 읽기 쉬우지만 전문가에게는 전자가 더 효율적입니다.
Brian

5

객체를 해체하는 ES6의 새로운 기능입니다.

우리 모두 알고 있듯이 여기에서 할당 작업이 발생합니다. 즉, 오른쪽 값이 왼쪽 변수에 할당된다는 의미입니다.

var { Navigation } = require('react-router');

이 경우 require('react-router')메소드는 다음과 같은 키 값 쌍을 가진 객체를 반환합니다.

{ Navigation: function a(){}, Example1: function b(){}, Example2: function c(){} }.

그리고 우리가 반환 된 객체에서 하나의 키를 가져오고 싶다면, 우리는 Navigation그것을 위해 Object destructing 을 사용할 수 있습니다 .

이것은 우리가 열쇠를 가지고있을 때만 가능할 것입니다.

따라서 대 입문 뒤에 지역 변수 Navigationfunction a(){}

또 다른 예는 다음과 같습니다.

var { p, q } = { p: 1, q:2, r:3, s:4 };
console.log(p) //1;
console.log(q) //2;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.