Javascript 是巴别塔';ES6对象解构的s实现正确吗?

Javascript 是巴别塔';ES6对象解构的s实现正确吗?,javascript,ecmascript-6,destructuring,Javascript,Ecmascript 6,Destructuring,所以基本描述是好的,{a,b}=obj将文件传输到a=obj.a;b=对象b 我的问题是关于我偶然遇到的一个奇怪的语法,我想知道是否有人能告诉我规范,因为我找不到它: ({a, b} = obj).c 这将执行两个a,b赋值,然后返回obj.c。对于字节流解码器,它实际上非常有用,我可以这样写: let width = ({bytes} = intDecode(bytes)).number; 我的问题是,我在任何地方都没有看到过这种语法,我不想依赖于错误实现或处于建议阶段的东西。解构赋值没有

所以基本描述是好的,
{a,b}=obj
将文件传输到
a=obj.a;b=对象b

我的问题是关于我偶然遇到的一个奇怪的语法,我想知道是否有人能告诉我规范,因为我找不到它:

({a, b} = obj).c
这将执行两个
a
b
赋值,然后返回
obj.c
。对于字节流解码器,它实际上非常有用,我可以这样写:

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

我的问题是,我在任何地方都没有看到过这种语法,我不想依赖于错误实现或处于建议阶段的东西。

解构赋值没有什么特殊之处:它被评估为具有
=
运算符的任何其他赋值

因此它返回
rval

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

一些细节:

分解部分在
6
[]中进行评估:

status
作为使用
rval
作为参数执行
assignmentPattern
DestructuringAssignmentEvaluation
的结果

在这个项目之后,赋值评估通常会发生,就像
a=b=42案例

参考资料:


是的,预计它会像这样工作(有关详细信息,请参阅@zerkms的答案)。您在任何地方都没有看到语法,这是因为访问赋值表达式结果的属性并不是很好的做法,因为这会使代码变得非常不可读。在这里,赋值给普通变量还是去结构表达式没有多大区别

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

let {bytes, number:width} = intDecode(bytes);
或者实际上,更接近您的原始代码:

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

然而,
rval
实际上是什么还是有争议的。12.4.4(1.a)
让rref是赋值表达式求值的结果。--我认为在
({a}=obj)
中,
rval==obj.a
,而不是
obj
@zyklus它不是,
rval
=/code>运算符的右操作数的值<代码>4。让rval为GetValue(rref)。
中的({a}=obj)表达式
rval
是符合规范的
obj
obj.a
是在解构赋值求值过程中查找的,它作为参数传递了
obj
。好的,我可以接受这一点——谢谢。我的反对意见是围绕着对在一个透明过程中会发生什么的困惑,这将是
(a=obj.a)
——但你是对的,这是描述的一部分,它与
(obj=intDecode(bytes)).number相同;bytes=obj.bytes
(可能除了求值顺序)-在ES5中使用相同的奇数语法。确保在某个地方声明了
字节
。@Felix Kling:这些括号只是为了看起来更像OP的原始代码还是其他东西?@zerkms:
{…}=foo
是语法错误,因为
{}
被解释为块。括号需要强制它们被解析为模式。@FelixKling:谢谢。当我用
{
开始一个解构赋值语句时,我总是觉得有些不对劲,但把它归因于ES6而不是语法错误,因为它太长了……我想知道它每天会遇到多少人。