-1

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

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

pqin与ie和var {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 中的字符串文字。*

4

2 回答 2

6

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

规范中与​​此相关的部分在运行时语义: AssignmentProperty下的 DestructingAssignmentEvaluation 中:IdentifierReference Initializer(倒数第二个)。AssignmentProperty 是您的a(和b......分别),并且。a is和 that的 StringValue'a'用作从中获取值的键o(在这种情况下等效o['a'])。

如果您这样做,它将起作用:

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

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

于 2015-08-10T09:11:43.863 回答
6
    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 将使用标识符“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

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

于 2015-08-10T09:36:15.913 回答