Babel 对 ES6 对象解构的实现是否正确?

Is Babel's implementation of ES6 object destructuring correct?

所以基本的结构化没问题,{a, b} = obj t运行堆到 a = obj.a; b = obj.b

我的问题是我不小心 运行 遇到了一些奇怪的语法,我想知道是否有人可以指出我的规范,因为我找不到它:

({a, b} = obj).c

那是两个 ab 作业,然后是 returns obj.c。对于字节流解码器,它实际上对我很有用,因为我可以写:

let width = ({bytes} = intDecode(bytes)).number;

我的问题是我在任何地方都没有看到这种语法,并且不想依赖未正确实现或处于提案阶段的东西。

解构赋值没有什么特别之处:它的求值方式与使用 = 运算符的任何其他赋值一样。

所以 returns rval.

这意味着您可以依赖您的语法。

一些细节:

解构部分在6[1]:

中求值

Let status be the result of performing DestructuringAssignmentEvaluation of assignmentPattern using rval as the argument.

在这个项目之后,作业评估像往常一样发生,就像 a = b = 42; 的情况一样。

参考文献:

是的,它应该是这样工作的(详见@zerkms 的回答)。您没有在任何地方看到语法是因为访问赋值表达式结果的属性并不是一个好的做法,因为它使代码非常不可读。无论您分配给普通变量还是解构表达式在这里都没有太大区别。

但是,您可以很容易地将代码转换为合理的解构赋值:

let {bytes, number:width} = intDecode(bytes);

或者实际上,更接近于您的原始代码:

let width;
({bytes, number:width} = intDecode(bytes));