Javascript 无var的对象分解

Javascript 无var的对象分解,javascript,ecmascript-6,Javascript,Ecmascript 6,如果前面没有var关键字,为什么对象分解会抛出错误 {a, b} = {a: 1, b: 2}; 抛出语法错误:应为表达式,得到“=” 以下三个示例工作正常 var {a, b} = {a: 1, b: 2}; var [c, d] = [1, 2]; [e, f] = [1, 2]; 额外的问题:为什么我们不需要一个var来进行数组的分解 我在做这样的事情时遇到了问题 function () { var {a, b} = objectReturningFunction();

如果前面没有
var
关键字,为什么对象分解会抛出错误

{a, b} = {a: 1, b: 2};
抛出语法错误:应为表达式,得到“=”

以下三个示例工作正常

var {a, b} = {a: 1, b: 2};
var [c, d] = [1, 2];
    [e, f] = [1, 2];
额外的问题:为什么我们不需要一个
var
来进行数组的分解

我在做这样的事情时遇到了问题

function () {
  var {a, b} = objectReturningFunction();

  // Now a and b are local variables in the function, right?
  // So why can't I assign values to them?

  {a, b} = objectReturningFunction();
}

这个问题源于JavaScript中具有多重含义的
{…}
操作符


{
出现在语句的开头时,它将始终表示一个无法赋值的对象。如果它稍后作为表达式出现在语句中,则它将表示一个对象

var
有助于区分这一点,因为它后面不能跟语句,如下所示:

从他们的文档中:

注意:当使用不带声明的对象文字解构赋值时,赋值语句周围的括号(…)是必需的

{a,b}={a:1,b:2}不是有效的独立语法,因为左侧的{a,b}被视为块而不是对象文字

但是,({a,b}={a:1,b:2})是有效的,var{a,b}={a:1,b:2}也是有效的

您的(…)表达式前面需要加一个分号,或者可以用来执行前一行的函数


如果编写Javascript时没有分号,那么“无声明的赋值”语法前面应该加一个分号,这样它才能按预期工作

让a,b
;({a,b}=objectReturningFunction())/还有另一种方法:

let {} = {a, b} = objectReturningFunction()
优点:

  • 不需要括号
  • 不需要分号
  • 额外的任务是保证无操作(考虑到没有发生奇怪的事情-而且,您的transpiler可能没有意识到这一点)
缺点:

  • 看起来有点奇怪,虽然在我看来没有比
    !(){…}()
    更奇怪的了
  • 可能会让人搞不清楚它为什么会出现。它保证会在第一次见面时就把人甩掉,所以我建议不要一次性使用它

如果它在语句后面作为表达式出现,那么它将表示一个对象。这是否意味着我们永远不能在分组括号中包含块作用域分组括号技巧是一个很好的技巧。这是一个让我费解的非常模糊的知识点。它允许跨作用域分解结构(嗯,有点-当然,您仍然需要声明变量)但它解决了使用承诺链的限制,同时需要使用从承诺链的一个步骤到另一个步骤解析的多个变量,而不会造成太多混乱。谢谢。是的。人们使用分号的原因!感觉IIFE比
;({a,b})
更类似于
让{}={…}
。不过技巧不错。:@proto-n,+1,非常聪明的主意。你是怎么想到这个的?
let {} = {a, b} = objectReturningFunction()