围绕javascript变量名称的{花括号}是什么意思

Geo*_*iev 145 javascript firefox firefox-addon

编辑 看着JSHint后,我发现这个" 解构表达"是ES6提供(使用esnext选项)或Mozilla JS扩展(使用MOZ) 看完后却我还是不明白为什么它被用来

我在MDN上遇到了以下代码

var ui = require("sdk/ui");
var { ActionButton } = require("sdk/ui/button/action");
Run Code Online (Sandbox Code Playgroud)

第二行的大括号是什么以及为什么使用它们?为什么第一行没有括号?

Mik*_*sen 195

这就是所谓的解构赋值,它是JavaScript 1.7(和ECMAScript 6)的一个新特性(目前,仅在FireFox JavaScript引擎中可用.)粗略地说,它将转化为:

var ActionButton = require("sdk/ui/button/action").ActionButton;
Run Code Online (Sandbox Code Playgroud)

在这个例子中似乎很愚蠢,因为只分配了一个项目.但是,您可以使用此模式一次分配多个变量:

{x, y} = foo;
Run Code Online (Sandbox Code Playgroud)

相当于:

x = foo.x;
y = foo.y;
Run Code Online (Sandbox Code Playgroud)

这也可以用于数组.例如,您可以轻松地交换两个值而不使用临时变量:

var a = 1;
var b = 3;

[a, b] = [b, a];
Run Code Online (Sandbox Code Playgroud)

可以使用kangax的ES6兼容性表跟踪浏览器支持.

  • 一个更有用的例子是`{width,height,color} = options`,它将取代行`width = options.width; height = options.height; color = options.color`. (27认同)
  • "在Firefox 2(2006年10月)中引入了JavaScript 1.7支持":D无论如何,它是ECMA-6草案的一部分([赋值](http://people.mozilla.org/~jorendorff/es6-draft.html #sec-destructuring-assignment),[binding](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-destructuring-binding-patterns)),所以它将[获得更广泛的浏览器支持] (在可预见的将来,(https://code.google.com/p/v8/issues/detail?id=811#c15).另外:`(function(arg1,{opt1,opt2}){console.log(arg1,opt1,opt2);})(1,{opt1:2,opt2:3})`.另外:`var {ActionButton:ab} = ...;` (3认同)
  • @CaseyFalk - 据我所知,`var {x,y} = ...`相当于`var x = ...`和`var y = ...`和`{x,y} = ...`相当于`x = ...`和`y = ...` (2认同)
  • @CaseyFalk-换句话说,你是对的。由于上面的示例声明了“ {ActionButton}”,因此我的*粗略翻译*是错误的。我已经更新了。 (2认同)
  • 我意识到这很“粗糙”——抱歉挑剔。:) 投一票。 (2认同)
  • 这也将是零碎的。我有一个返回一个大的复杂对象的函数。我只需要其中的一件。例如,函数返回 `{client: abc, db: xyz}` 在我对函数的调用中,我使用 `const {client} = wait functionCall()` 并得到了我需要的一小部分。[参考](https://maxcode.online/nextjs-mongodb-integration-with-api-routes/) (2认同)