没有变量的对象解构

ala*_*the 75 javascript ecmascript-6

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

{a, b} = {a: 1, b: 2};
Run Code Online (Sandbox Code Playgroud)

SyntaxError: expected expression, got '='

以下三个示例没有问题

var {a, b} = {a: 1, b: 2};
var [c, d] = [1, 2];
    [e, f] = [1, 2];
Run Code Online (Sandbox Code Playgroud)

奖金问题:为什么我们不需要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();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ski 126

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

{出现在Statement的开头时,它将始终表示一个无法分配的.如果它稍后在Statement中作为表达式出现,那么它将代表一个Object.

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

( {a, b} = objectReturningFunction() );
Run Code Online (Sandbox Code Playgroud)

来自他们的文档: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}

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


SNa*_*Nag 16

考虑:

colors = { r: 204, g: 51, b: 102, hex: "#cc3366" };
Run Code Online (Sandbox Code Playgroud)

以下是一些解构方法的要点:

解构为变量

let { r, g, b } = colors;
// initializes variables r, g, b
Run Code Online (Sandbox Code Playgroud)

解构为具有不同名称的变量

let { r: red, g: green, b: blue } = colors;
// initializes variables red, green, blue
Run Code Online (Sandbox Code Playgroud)

解构现有变量

let r, g, b;
...
({ r, g, b } = colors);
Run Code Online (Sandbox Code Playgroud)

解构具有不同名称的现有变量

let red, green, blue;
...
({ r: red, g: green, b: blue } = colors);
Run Code Online (Sandbox Code Playgroud)

解构为具有相同属性名称的另一个对象

let myColor = { r: 0, g: 0, b: 0 };
...
({ r: myColor.r, g: myColor.g, b: myColor.b } = colors);
Run Code Online (Sandbox Code Playgroud)

解构为具有不同属性名称的另一个对象

let myColor = { red: 0, green: 0, blue: 0 };
...
({ r: myColor.red, g: myColor.green, b: myColor.blue } = colors);
Run Code Online (Sandbox Code Playgroud)


dav*_*wil 13

如果您编写的JavaScript不带分号,则“无声明的赋值”语法应以分号开头,以使其可预期地工作

let a, b

;({a, b} = objectReturningFunction()) // <-- note the preceding ;
Run Code Online (Sandbox Code Playgroud)

只是想突出显示它,因为它吸引了我,并希望可以节省一些时间弄清楚为什么它不起作用和/或使用代码格式化程序等产生怪异的结果。

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

  • 是的。人们使用分号的一个原因! (5认同)

pro*_*o-n 8

这是另一种方式:

let {} = {a, b} = objectReturningFunction()
Run Code Online (Sandbox Code Playgroud)

优点:

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

缺点:

  • 看起来!(){...}() 有点奇怪,虽然在我看来并不比IIFE更奇怪。
  • 可能会混淆为什么它在那里。肯定会在第一次遇到时将人们拒之门外,因此我建议不要将其用作一次性使用。

  • @proto-n,+1,非常聪明的主意。你是怎么发现这个的? (2认同)