Notation der Javascript-Objektklammer ({Navigation} =) auf der linken Seite der Zuweisung

108

Ich habe diese Syntax noch nie gesehen und frage mich, worum es geht.

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

Die Klammern links geben einen Syntaxfehler aus:

unerwartetes Token {

Ich bin nicht sicher, welcher Teil der Webpack-Konfiguration transformiert wird oder welchen Zweck die Syntax hat. Ist es eine Harmonie-Sache? Kann mich jemand aufklären?

Captainill
quelle
In Ihrem haben webpack.config.jsSie wahrscheinlich jsx-loadermit harmonyaktivierter Flagge
Paolo Moretti

Antworten:

111

Es heißt Destructuring Assignment und ist Teil des ES2015-Standards .

Die Destrukturierungszuweisungssyntax ist ein JavaScript-Ausdruck, mit dem Daten aus Arrays oder Objekten mithilfe einer Syntax extrahiert werden können, die die Konstruktion von Array- und Objektliteralen widerspiegelt.

Quelle: Destruktionszuweisungsreferenz auf MDN

Objektzerstörung

 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-Destrukturierung

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
quelle
4
Vielen Dank. Ich werde das akzeptieren und eine andere Frage stellen. Jetzt, da ich weiß, wie die Syntax lautet, muss ich herausfinden, was in meinem Projekt noch nicht kompiliert wird.
Captainill
Webpack verwendet Esprima und wird es6 unterstützen, wenn Esprima 2.0 veröffentlicht wird . Bis dahin können Sie einen der es6-Loader verwenden, der es zu es5 kompiliert: github.com/conradz/esnext-loader github.com/Couto/6to5-loader github.com/shama/es6-loader
Johannes Ewald
2
Ich habe diese Lösung abgelehnt, weil sie das von ihm angegebene Beispiel nicht adressierte, das in der Lösung nicht gezeigt wird. Das erste Beispiel zeigt, wie ein Objektliteral zerstört wird. Das zweite zeigt ein Array, das zerstört wird. Das fragliche Beispiel lautet jedoch: var {Navigation} = require ('react-router'); Darüber hinaus sind in dem Beispiel, das er gegeben hat, die Klammern unnötig.
AndroidDev
2
@AndroidDev Gerne können Sie eine Bearbeitung vorschlagen. Das OP schien die Antwort sicherlich zufriedenstellend zu finden.
Matt Ball
1
Irgendeine Idee, warum die [Umbenennung] "rückwärts" ist? Das heißt, var {newVarName: oldVarName} = varSource;sieht sehr nach { newVarName: varSource.oldVarName }oder aus scope.newVarName = varSource.oldVarName;, aber diese sind offensichtlich falsch. Gibt es einen praktischen Grund dafür, dass die alten / vorhandenen Namen links von der stehen :?
Ruffin
113

Dies ist eine Destrukturierungsaufgabe . Es ist eine neue Funktion von ECMAScript 2015.

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

Entspricht:

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

... nutzt Destrukturierung, um das Gleiche zu erreichen wie ...

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

... ist aber weitaus lesbarer.

Cliff Hall
quelle
3
Dies beantwortet die gestellte Frage direkt und ist daher wahrscheinlich die beste Antwort, die Sie zuerst lesen sollten, während einige der früheren Antworten ausführlicher behandelt werden.
Mallory-Erik
3
Prägnanter ... ja. Lesbarer - nicht wirklich. Das letztere Beispiel ist expliziter, wenn grundlegendere Konstrukte verwendet werden, daher ist es besser lesbar - aber für einen Experten ist das erstere effizienter.
Brian
5

Es ist eine neue Funktion in ES6, um Objekte zu zerstören.

Wie wir alle wissen, findet hier eine Zuweisungsoperation statt, was bedeutet, dass der Wert auf der rechten Seite der Variablen auf der linken Seite zugewiesen wird.

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

In diesem Fall gibt die require('react-router')Methode ein Objekt mit einem Schlüsselwertpaar zurück

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

Und wenn wir möchten , einen Schlüssel in diesem zurückgegebene Objekt sagen nehmen , Navigationum eine Variable , die wir verwenden können , Object destructing dafür.

Dies ist nur möglich, wenn wir den Schlüssel in der Hand haben.

Nach der Zuweisungsanweisung Navigationenthält die lokale Variablefunction a(){}

Ein anderes Beispiel sieht so aus.

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