割り当ての左側にあるJavascriptオブジェクトブラケット表記({ナビゲーション} =)


108

私はこれまでにこの構文を見たことがなく、それが何なのか疑問に思っています。

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

左側の括弧は構文エラーを投げています:

予期しないトークン{

webpack設定のどの部分が変換されているのか、構文の目的が何かはわかりません。ハーモニーなの?誰かが私を啓発できますか?


あなたには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の1つを使用できます:github.com/conradz/esnext-loader github.com/Couto/6to5-loader github.com/shama/es6-loader
Johannes Ewald

2
ソリューションに示されていない彼の例に対処できなかったため、このソリューションに反対票を入れました。最初の例は、分解されているオブジェクトリテラルを示しています。2番目は、解体されている配列を示しています。しかし問題となっている例はこれです:var {Navigation} = require( 'react-router'); さらに、彼が挙げた例では、ブレースは不要です。
AndroidDev 2017

2
@AndroidDev編集の提案を歓迎します。OPは確かに答えを満足できるように思われた。
マットボール

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
これは質問どおりに直接回答するため、おそらく最初に読むのが最善の回答ですが、以前の回答のいくつかはより深く掘り下げています。
マロリー・エリック

3
もっと簡潔に...はい。より読みやすい-本当に。後者の例は、より基本的な構造を使用してより明示的であるため、より読みやすくなっていますが、専門家にとっては前者の方が効率的です。
ブライアン、

5

これは、オブジェクトを分解するためのES6の新機能です。

ここでは代入演算が行われていることを知っているので、右側の値が左側の変数に代入されます。

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

この場合、require('react-router')メソッドは次のようなキーと値のペアを持つオブジェクトを返します

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

そして、返されたオブジェクトの1つのキーをNavigation変数に伝えたい場合は、Object Destructingを使用できます。

これは、鍵を手元に持っている場合にのみ可能です。

したがって、代入ステートメントの後、ローカル変数Navigationにはfunction 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.