为什么 ECMASCRIPT 6 在解构赋值中颠倒了赋值的顺序?

7

为什么ES6决定在解构赋值中使用左侧赋值更有意义或更有用呢?乍一看,这似乎会使代码更容易出错,因为赋值可以发生在两侧,取决于情况。

let obj = { first: 'Jane', last: 'Doe' };
let { first: f, last: l } = obj;
// f = 'Jane'
// l = 'Doe'

f和l似乎都是在左侧定义的,使用左侧变量名称的值以及右侧变量的值的组合。

考虑到这种语法的原理是与对象声明语法保持相同,为什么ECMA不使用以下语法:

let { f: first, l: last } = obj;

6
既然“赋值”现在可以在两侧进行,那么您分配的变量仍然在左侧,而您分配给这些变量的数据仍然在右侧,对吗? - tkausl
2
你能展示一下你认为难以理解的一些代码吗? - Jaromanda X
2
你是指为什么在 const {foo: bar} = a 中新变量是 bar 而不是 foo 吗? - Kos
1
@BrianFreud 我不知道你如何期望你的替代方法能够工作 - 对象是 无序 的,因此执行 let {f, l} = obj 将从对象中随机获取属性。因此,如果您想要特定的属性,您需要将它们标记为...这会让您得到 let {first: f, last: l}。你发现“令人困惑”和“容易出错”的事情实际上恰恰相反。 - VLAZ
1
我不明白你所说的“reversed”是什么意思。赋值是从右边(源值)到左边(目标)进行的。 - melpomene
显示剩余15条评论
1个回答

9

因为它应该保持对象字面量语法:属性名在冒号之前。语法应该嵌套,如果目标在左侧,那么这将无法正常工作:

let {propName: [arrayElement, ...moreElements], otherName: {nestedProp: targetName}} = obj;

在您的方法中,它将会是:
let {[arrayElement, ...moreElements]: propName, {targetName = nestedProp}: otherName} = obj;

在IT技术中,有些情况下冒号可能没有任何意义。


1
好观点,但有人可能会认为冒号本来就没有意义,将其包含在解构语法中只会导致混淆的根源... - Hamid Sadeghian
没错 - 他们本可以用其他标记代替那个冒号。这太令人困惑了 - 看起来你正在将值(由)obj.f包含的值分配给属性first,而实际上发生的情况恰恰相反。{first -> f, last -> l} = obj可能是更好的方法。 - Tom Auger
@TomAuger 运算符并不重要。在JavaScript中,:就像PHP或Scala中的->一样。 - Bergi
2
@Bergi 我并不是在提出语法问题,而是认知问题。当你设计一种新的语言结构,带有一种新的运算符时,你有机会决定哪个标记表示运算符的功能。使用“:”来别名oldkey : newkey的决定并不完全对应于现有的“key : value”的范例。 - Tom Auger
@TomAuger,它不是“oldkey:newkey”,而是“key:target”,这与“key:value”非常匹配。 - Bergi

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