对象解构语法 - ES6

ove*_*nge -1 javascript destructuring ecmascript-6

我经历过数组解构语法,这是很好理解的.

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

pqvar {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
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*mit 6

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

规范中的相关部分是在运行时语义:AssignmentProperty:IdentifierReference Initializer(最后的第二个)下的DestructingAssignmentEvaluation.AssignmentProperty是你的a(和b......分开),和.的的StringValue a'a'和被用作密钥以获得从一个值o(相当于o['a']在这种情况下).

如果你这样做,它会工作:

var {p:a, q:b} = o;
Run Code Online (Sandbox Code Playgroud)

它使用AssignmentProperty:PropertyName:AssignmentElement(last entry),它使用了一个名称(p)和一个赋值元素(a).


csw*_*swl 5

    var o = {p: 42, q: true};
     var {p, q} = o;
Run Code Online (Sandbox Code Playgroud)

在这里,var {p,q} = o只是一个简写 var {p:p , q:q} = o

考虑一下.

      var o = { key : "value" };
      var { key : local_var } = o ;
      local_var === o["key"] // true
Run Code Online (Sandbox Code Playgroud)

如果省略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
Run Code Online (Sandbox Code Playgroud)

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