你能解释一下这个JavaScript语法(变量外推)吗?

4
我刚刚看到了一些我从未见过的东西,似乎无法找到一个解释它真正是什么的说明……在ES5.1标准和ES6草案中都没有,在Mozilla ES6支持中也没有。
请在技术上解释正在发生的事情(匿名对象、匿名块?),并提供ES标准的某个部分或其他资源的参考,以解释这一点。
上下文是一个火狐扩展。
const // var also works here it seems
{
      classes    : Cc
    , interfaces : Ci
    , utils      : Cu

} = Components

它在当前作用域中创建了变量Cc、Ci、Cu。这有点违反直觉,因为它看起来像是一个匿名对象,但是人们会期望左边是属性名称,右边是值...
问题的来源:https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/JavaScript_Object_Management 更新:感谢Leo,我找到了正确的词(解构)。我发现this blog解释得非常好。
2个回答

7
这是ES6的解构。更具体地说,是对象解构组件应该像这样:
{classes: 'asdf', interfaces: 'qwer', utils: `zxcv`}

然后你会得到三个常量(使用const定义,在赋值后是只读的):

Cc // 'asdf'
Ci // 'qwer'
Cu // 'zxcv'

非常感谢。我仍然觉得从左到右赋值很反直觉,但我也不必使用它... - user1115652
@nus 是的,我也不喜欢这种语法,但它非常方便。 - Leo
@slicedtoad 在浏览器端是可以的。在服务器端,比如NodeJS,很快就会实现 :) - Leo
@nus 我认为这种语法在函数式编程语言中非常常见(JavaScript 喜欢假装自己是函数式的)。在 FP 中,函数通常返回可以像这样分解成它们各个部分的元组。如果我们在不久的将来开始在其他主要语言中看到类似的东西,我也不会感到惊讶。 - JLRishe
@JLRishe 反直觉的事情不是获取复合值,而是你获得 { incomingValue : variableName }。请注意 incomingValue: ,即左侧是可选的。我不确定其他编程语言是否经常这样做,因此我不是函数式语言的粉丝,所以我可能是错的。 - user1115652
显示剩余3条评论

1

根据Mozilla文档所述:

常见的做法是通过将对象的引用存储为常量来缩写Components.classesComponents.interfaces

const Cc = Components.classes, Ci = Components.interfaces;

var os = Cc["@mozilla.org/observer-service;1"] .getService(Ci.nsIObserverService);

这里展示了ES6对象解构进一步压缩这种常见做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接