对象解构语法 - ES6

时间:2015-08-10 09:08:10

标签: javascript ecmascript-6 destructuring

我经历过数组解构语法,这很好理解。

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

p中的qvar {p, q}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中的字符串文字。*

2 个答案:

答案 0 :(得分:6)

这是因为使用语法进行对象破坏,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)。

答案 1 :(得分:5)

    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

这可能不完全正确,但应该有助于您理解它 它类似于其他语言提供的模式匹配,但它有所不同。