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)
只是想突出显示它,因为它吸引了我,并希望可以节省一些时间弄清楚为什么它不起作用和/或使用代码格式化程序等产生怪异的结果。
确实,它实际上就在公认的答案中(引用文档的最后一行),但很容易错过,尤其是在没有看到示例的情况下!
这是另一种方式:
let {} = {a, b} = objectReturningFunction()
Run Code Online (Sandbox Code Playgroud)
优点:
缺点: