没有 var、let 或 const 的对象解构

IT技术 javascript ecmascript-6
2021-02-01 14:03:56

如果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();
}
3个回答

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

{出现在Statement的开头时,它将始终代表一个无法分配如果它稍后出现在Statement 中作为Expression,那么它将代表一个对象。

var有助于使这种区别,因为它不能跟一个声明,如将分组括号

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

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

注意:在没有声明的情况下使用对象字面量解构赋值时,赋值语句周围的括号 ( ... ) 是必需的。

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

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

您的 ( ... ) 表达式需要以分号开头,或者它可用于执行前一行的函数。

分组括号提示是一个很好的提示。
2021-03-16 14:03:56
如果它稍后作为表达式出现在语句中,那么它将代表一个对象。这是否意味着我们永远不能在分组括号内拥有块作用域
2021-03-28 14:03:56
这是一个非常晦涩的知识,让我难住了。它允许跨范围解构(好吧,有点 - 当然,您仍然需要声明您的变量)。但它解决了使用 Promise 链的限制,同时需要使用从 Promise 链的一个步骤解析的多个变量到另一个,而不会造成太多混乱。谢谢。
2021-04-04 14:03:56

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

let a, b

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

只是想强调这一点,因为它让我发现了这一点,并希望可以为其他人节省一些时间来弄清楚为什么它不起作用和/或使用prettier.

事实上,它实际上就在接受的答案中(引用文档的最后一行),但很容易错过,尤其是没有看到示例!

是的。人们使用分号的一个原因!
2021-03-29 14:03:56

这是另一种方式:

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

优点:

  • 不需要括号
  • 不需要分号
  • 额外的分配是有保证的空操作(假设没有发生奇怪的事情 - 而且,您的转译器可能没有意识到这一点)

缺点:

  • 看起来!(){...}() 有点奇怪,虽然在我看来并不比IIFE更奇怪
  • 可能会混淆为什么它在那里。第一次遇到它肯定会让人们失望,所以我建议不要将它用作一次性使用。
@proto-n,+1,非常聪明的想法。你是怎么遇到这个的?
2021-03-24 14:03:56
有点感觉 IIFE;({ a, b })let {} = { ... }. 不错的把戏。:)
2021-04-08 14:03:56