Notazione tra parentesi dell'oggetto Javascript ({Navigation} =) sul lato sinistro di assign


108

Non ho visto questa sintassi prima e mi chiedo di cosa si tratti.

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

Le parentesi a sinistra generano un errore di sintassi:

gettone inaspettato {

Non sono sicuro di quale parte della configurazione del webpack si stia trasformando o quale sia lo scopo della sintassi. È una cosa di armonia? Qualcuno può illuminarmi?


Nel tuo webpack.config.jsprobabilmente hai jsx-loadercon la harmonybandiera abilitata
Paolo Moretti

Risposte:


112

Si chiama assegnazione destrutturante e fa parte dello standard ES2015 .

La sintassi di assegnazione destrutturante è un'espressione JavaScript che rende possibile estrarre dati da array o oggetti utilizzando una sintassi che rispecchia la costruzione di array e letterali oggetto.

Fonte: riferimento dell'assegnazione di destrutturazione su MDN

Destrutturazione di oggetti

 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 destrutturazione

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
Grazie. Lo accetterò e porrò un'altra domanda. Ora che so qual è la sintassi, devo capire cosa non sta ancora compilando nel mio progetto.
capitanill

Webpack utilizza Esprima e avrà il supporto per es6 quando Esprima 2.0 sarà pubblicato . Fino ad allora puoi usare uno dei caricatori es6 che lo compila fino a es5: github.com/conradz/esnext-loader github.com/Couto/6to5-loader github.com/shama/es6-loader
Johannes Ewald

2
Ho svalutato questa soluzione perché non è riuscita ad affrontare l'esempio che ha fornito che non è mostrato nella soluzione. Il primo esempio mostra un oggetto letterale che viene destrutturato. Il secondo mostra un array che viene destrutturato. Ma l'esempio in discussione è questo: var {Navigation} = require ('react-router'); Inoltre, nell'esempio che ha fornito, le parentesi graffe non sono necessarie.
AndroidDev

2
@AndroidDev sei libero di suggerire una modifica; l'OP sembrava certamente trovare la risposta soddisfacente.
Matt Ball

1
Qualche idea sul perché la [ri] denominazione sia "al contrario"? Cioè, var {newVarName: oldVarName} = varSource;assomiglia molto a { newVarName: varSource.oldVarName }o scope.newVarName = varSource.oldVarName;, ma quelli sono, ovviamente, sbagliati. C'è una ragione pratica per avere i nomi vecchi / esistenti a sinistra di :?
ruffin

114

Questo è un incarico destrutturante . È una nuova funzionalità di ECMAScript 2015.

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

È equivalente a:

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

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

... usa la destrutturazione per ottenere la stessa cosa di ...

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

... ma è molto più leggibile.


3
Questo risponde direttamente alla domanda posta e quindi è probabilmente la migliore risposta da leggere per prima, mentre alcune delle risposte precedenti vanno più in profondità.
Mallory-Erik

3
Più conciso ... sì. Più leggibile, non proprio. Il secondo esempio è più esplicito utilizzando costrutti più fondamentali, quindi è più leggibile, ma per un esperto il primo è più efficiente.
Brian

5

È una nuova funzionalità di ES6 per destrutturare gli oggetti.

Come tutti sappiamo, qui è in corso un'operazione di assegnazione, il che significa che il valore del lato destro viene assegnato alla variabile del lato sinistro.

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

In questo caso, il require('react-router')metodo restituisce un oggetto con una coppia chiave-valore simile

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

E se volessimo prendere una chiave in quell'oggetto restituito diciamo Navigationa una variabile che possiamo usare la distruzione di oggetti per quello.

Questo sarà possibile solo se avremo la chiave in mano.

Quindi, dopo l'istruzione di assegnazione, la variabile locale Navigationconterràfunction a(){}

Un altro esempio è questo.

var { p, q } = { p: 1, q:2, r:3, s:4 };
console.log(p) //1;
console.log(q) //2;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.