【问题标题】:Why did ECMASCRIPT 6 reverse the sides for assignment when destructuring? [closed]为什么 ECMASCRIPT 6 在解构时反转分配的边? [关闭]
【发布时间】:2022-01-21 14:12:50
【问题描述】:

为什么 ES6 决定左侧赋值更有意义或对解构赋值更有用?乍一看,这似乎使代码更容易出错,现在分配可以在双方发生,具体取决于情况。

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

f 和 l 似乎都在左侧定义,使用左侧的 var 名称和右侧的这些 var 的值组合的值。

鉴于此语法的基本原理是保持它与对象声明语法相同,为什么 ECMA 不使用:

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

【问题讨论】:

  • "现在两边都可以赋值" 你赋值给的变量还在左边,你赋值给这些变量的数据还在右边,不是吗?
  • 你能展示一些你认为让你困惑的代码吗?
  • 你的意思是为什么const {foo: bar} = a 中的新变量是bar 而不是foo
  • @BrianFreud 我不知道您希望您的替代方案如何工作 - 对象是 not 排序的,因此 let {f, l} = obj 将为您提供对象的 RANDOM 属性。所以,如果你想拥有特定的属性,你需要给它们贴上标签……这会给你留下let {first: f, last: l}。你觉得“令人困惑”和“容易出错”的事情恰恰相反。
  • 我不明白你所说的“反转”是什么意思。赋值从右(源值)到左(目标)。

标签: javascript ecmascript-6 ecma


【解决方案1】:

因为它应该保留对象文字语法:属性名称位于冒号之前。语法应该是嵌套的,如果目标在左侧,那将无法正常工作:

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

在你的方法中,它会是

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

冒号没有任何意义。

【讨论】:

  • 好点,但有人可能会争辩说,冒号无论如何都没有任何意义,并且将其包含在解构语法中是混乱的根源......
  • 对 - 他们本可以取消该冒号以支持其他一些标记。这非常令人困惑 - 看起来您正在为属性 first 分配值(由 obj.f 包含),这实际上与正在发生的事情相反。 {first -> f, last -> l} = obj 可能是更好的方法
  • @TomAuger 运营商真的没关系。 JavaScript 中的 : 与 PHP 或 Scala 中的 -> 相同。
  • @Bergi 我没有提出句法要点,而是提出认知要点。当您使用一种新的运算符设计一种新的语言结构时,您有机会决定用什么标记来表达运算符的功能。使用“:”来别名 oldkey : newkey 的决定并不完全对应于 key : value 的现有范式。
  • @TomAuger 不是oldkey : newkey,而是key: target,匹配key: value就好了。
猜你喜欢
  • 2014-12-06
  • 1970-01-01
  • 2011-10-10
  • 2014-03-02
  • 2015-08-13
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多