【问题标题】:Object destructuring syntax - ES6对象解构语法 - ES6
【发布时间】:2023-03-03 20:59:01
【问题描述】:

我学过数组解构语法,很好理解。

当我们说var {p, q} = o; 时,我们到底在做什么?

var {p, q} 中的 pq 是否不同于 o 的属性,即 'p''q'?如果是的话,

为什么var {a, b} = o; 不起作用?

> var o = {p: 42, q: true};
    undefined
> p
    ReferenceError: p is not defined
> q
    ReferenceError: q is not defined
> o['p']
    42
> o['q']
    true
> var {p, q} = o;
    undefined
> p
    42
> q
    true
> var {a, b} = o;
    undefined
> a
    undefined
> b
    undefined

*注意:我了解到,字典键是 javascript 中的字符串文字。*

【问题讨论】:

  • var {p, q} = o; === var p = o.p;var q = o.q; 这仅在变量具有相同名称时有效。
  • @Kitler 这不是一个奇特的概念吗?派生出哪种编程语言概念来提供这种便利?有没有其他语言可以做这种奇怪的事情?我认为解构是由 python 启发的
  • Weird 是非常主观的,从名称匹配的对象中为属性分配值是一种常见的模式,这个概念取自 coffeescript iirc。
  • 与对象上的键同名...感觉你甚至没有尝试过tbh,给learn es 2015阅读。

标签: javascript ecmascript-6 destructuring


【解决方案1】:
    var o = {p: 42, q: true};
     var {p, q} = o;

这里,var {p,q} = o 只是 var {p:p , q:q} = o 的简写

考虑一下。

      var o = { key : "value" };
      var { key : local_var } = o ;
      local_var === o["key"] // true

如果你省略 local_var,然后写 var {key} = o; 将使用标识符“key”创建一个新的变量键。,就像做 var key = o["key"]

所以在你的例子中就像这样做

      var p =  o["p"] ;  //42
       var q = o["q"];   //true
       var a = o["a"];  // undefined
       var b = o["b"];   //undefined

这可能并不完全正确,但应该可以帮助您理解它。
这有点像其他语言提供的模式匹配,但它是不同的。

【讨论】:

  • var o = {p: 42, q: true}; 然后var {a:var1, b:var2} = o; 这不起作用。 'a''b''p''q' 是字符串文字。
【解决方案2】:

这是因为使用您的对象破坏语法,LHS 表达式 ({a, b}) 中使用的名称被用作 RHS 表达式 (o) 的键。由于ab 不是o 的属性,因此失败(返回undefined)。

规范中与此相关的部分位于 AssignmentProperty : IdentifierReference Initializer 下的Runtime Semantics: DestructingAssignmentEvaluation(倒数第二个)。 AssignmentProperty 是您的a(和b...分别),并且。 a 的 StringValue 是 'a',它用作从 o 获取值的键(在这种情况下相当于 o['a'])。

如果你愿意,它会起作用:

var {p:a, q:b} = o;

使用 AssignmentProperty : PropertyName : AssignmentElement(最后一个条目),它使用属性名称 (p) 和分配元素 (a)。

【讨论】:

  • ab 是标识符。 pqvar {p, q} 中的标识符。但是'p''q' 是字典o 中的属性(键),它们是字符串原始文字。名称匹配是什么意思?
  • p & qo 的属性。可以使用 object['key'] 表示法 (o['p']) 或通过 object.key 表示法 (o.p) 将它们作为字符串键引用。无论哪种情况,这都与此问题无关。全局 pq 变量在这种情况下不起作用。
  • @Kay - 感谢您在我离开时“接管” :-)。
  • @overexchange:FWIW,给定o = {p:1, q:2},这里没有字符串文字。 pq 实际上是标识符名称。对象文字表示法允许将字符串文字数字文字标识符名称作为“键”。 ES6 还引入了计算属性名。某些东西在语法中的表达方式和在内存中的表达方式可能会有所不同。如果您谈论“文字”,那么您谈论的是语法,而不是运行时行为。
猜你喜欢
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2020-02-18
  • 2017-07-24
  • 2018-07-25
  • 2018-08-30
  • 2017-08-23
相关资源
最近更新 更多