分配左侧的Javascript对象括号表示法({Navigation} =)


108

我以前没有看过这种语法,并且想知道它的全部含义。

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

左侧的括号引发语法错误:

意外的标记 {

我不确定webpack配置的哪个部分正在转换或语法的目的是什么。这是和谐的事情吗?有人可以启发我吗?


在您中,webpack.config.js您可能已启用jsx-loaderharmony标记
Paolo Moretti

Answers:


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
谢谢。我将接受这一点,并提出另一个问题。现在,我知道语法是什么,我必须弄清楚它仍未在我的项目中编译。
船长

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肯定会找到令人满意的答案。
马特·鲍尔

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对一个变量说,我们可以为此使用对象销毁

仅当我们拥有钥匙时,这才有可能。

因此,在赋值语句之后,局部变量Navigation将包含function a(){}

另一个示例如下所示。

var { p, q } = { p: 1, q:2, r:3, s:4 };
console.log(p) //1;
console.log(q) //2;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.