对象解构没有 var、let 或 const

2022-08-30 02:43:01

如果对象解构前面没有关键字,为什么会引发错误?var

{a, b} = {a: 1, b: 2};

抛出SyntaxError: expected expression, got '='

以下三个示例没有问题

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();
}

答案 1

问题源于运算符在JavaScript中具有多种含义。{...}

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

这有助于进行这种区分,因为它不能跟在语句后面,分组括号也是如此var

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

从他们的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#assignment_separate_from_declaration_2

注意:在没有声明的情况下使用对象文本解构赋值时,赋值语句两边的括号 ( ...) 是必需的。

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

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

您的 ( ... ) 表达式前面需要有一个分号,或者它可以用来在前一行上执行函数。


答案 2

如果你写的Javascript不带分号,那么“不带声明的赋值”语法前面应该有一个分号,以便它可以预测地工作。

let a, b

;({a, b} = objectReturningFunction()) // <-- note the preceding ;

只是想强调这一点,因为它抓住了我,并希望可以节省其他人一些时间来弄清楚为什么它不起作用和/或使用像这样的代码格式化程序产生奇怪的结果。prettier

事实上,它实际上就在公认的答案(引用文档的最后一行)中,但很容易错过,特别是没有看到一个例子!