Notação de colchete de objeto Javascript ({Navigation} =) no lado esquerdo da atribuição

108

Eu não vi essa sintaxe antes e estou me perguntando do que se trata.

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

Os colchetes à esquerda estão gerando um erro de sintaxe:

token inesperado {

Não tenho certeza de qual parte da configuração do webpack está se transformando ou qual é o propósito da sintaxe. É uma coisa do Harmony? Alguém pode me esclarecer?

capitão
fonte
No seu webpack.config.jsvocê provavelmente tem jsx-loadercom a harmonybandeira ativada
Paolo Moretti

Respostas:

112

É chamado de atribuição de desestruturação e faz parte do padrão ES2015 .

A sintaxe de atribuição de desestruturação é uma expressão JavaScript que torna possível extrair dados de matrizes ou objetos usando uma sintaxe que espelha a construção de literais de matriz e objeto.

Fonte: Referência de atribuição de desestruturação no MDN

Desestruturação de objetos

 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

Array desestruturando

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;
Matt Ball
fonte
4
Obrigado. Vou aceitar isso e fazer outra pergunta. Agora que sei qual é a sintaxe, preciso descobrir o que ainda não está compilando no meu projeto.
capitainill de
O Webpack usa o Esprima e terá suporte para o es6 quando o Esprima 2.0 for publicado . Até então, você pode usar um dos es6-loader que o compila até es5: github.com/conradz/esnext-loader github.com/Couto/6to5-loader github.com/shama/es6-loader
Johannes Ewald
2
Eu votei contra esta solução porque ela falhou em abordar o exemplo que ele deu, que não é mostrado na solução. O primeiro exemplo mostra um literal de objeto sendo desestruturado. O segundo mostra uma matriz sendo desestruturada. Mas o exemplo que está sendo questionado é o seguinte: var {Navigation} = require ('react-router'); Além disso, no exemplo que ele deu, os suspensórios são desnecessários.
AndroidDev
2
@AndroidDev, você pode sugerir uma edição; o OP certamente pareceu achar a resposta satisfatória.
Matt Ball
1
Alguma ideia de por que a [re] nomeação é "ao contrário"? Ou seja, var {newVarName: oldVarName} = varSource;parece muito com { newVarName: varSource.oldVarName }ou scope.newVarName = varSource.oldVarName;, mas esses estão, obviamente, errados. Existe uma razão prática para ter os nomes antigos / existentes à esquerda do :?
ruffin
114

Esta é uma tarefa de desestruturação . É um novo recurso do ECMAScript 2015.

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

É o equivalente a:

var AppRegistry = React.AppRegistry;
var StyleSheet = React.StyleSheet;
var Text = React.Text;
var View = React.View;
Rudolf Manusachi
fonte
17
var { Navigation } = require('react-router');

... usa a desestruturação para conseguir o mesmo que ...

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

... mas é muito mais legível.

Cliff Hall
fonte
3
Isso responde diretamente à pergunta feita e, portanto, é provavelmente a melhor resposta para ler primeiro, enquanto algumas das respostas anteriores são mais aprofundadas.
Mallory-Erik
3
Mais conciso ... sim. Mais legível - não realmente. O último exemplo é mais explícito usando construções mais fundamentais, portanto, é mais legível - mas para um especialista, o primeiro é mais eficiente.
Brian de
5

É um novo recurso do ES6 para desestruturar objetos.

Como todos sabemos que há uma operação de atribuição ocorrendo aqui, o que significa que o valor do lado direito está sendo atribuído à variável do lado esquerdo.

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

Neste caso, o require('react-router')método retorna um objeto com um par de valores-chave, algo como

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

E se quisermos pegar uma chave nesse objeto retornado, digamos Navigationpara uma variável, podemos usar a destruição de objetos para isso.

Isso só será possível se tivermos a chave em mãos.

Portanto, após a instrução de atribuição, a variável local Navigationconteráfunction a(){}

Outro exemplo se parece com este.

var { p, q } = { p: 1, q:2, r:3, s:4 };
console.log(p) //1;
console.log(q) //2;
Rajendra kumar Vankadari
fonte