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而不是语法错误,因为它太长了……我想知道它每天会遇到多少人。