Javascript 在同时使用解构赋值的同时赋值给新变量

Javascript 在同时使用解构赋值的同时赋值给新变量,javascript,ecmascript-6,Javascript,Ecmascript 6,ES6引入了支持从对象解包值的语法: let { r = 0, g = 0, b = 0 } = { r: 255, g: 55 }; let color = { r, g, b }; console.log(color, r, g, b); // prints "{r: 255, g: 55, b: 0} 255 55 0" 但是,以下代码段不会有相同的效果: let color = { r = 0, g = 0, b = 0 } = { r: 255, g: 55 } console.l

ES6引入了支持从对象解包值的语法:

let { r = 0, g = 0, b = 0 } = { r: 255, g: 55 };
let color = { r, g, b };
console.log(color, r, g, b);  // prints "{r: 255, g: 55, b: 0} 255 55 0"
但是,以下代码段不会有相同的效果:

let color = { r = 0, g = 0, b = 0 } = { r: 255, g: 55 }
console.log(color);  // prints "{r: 255, g: 55}"
如果颠倒顺序,则相同:

let { r = 0, g = 0, b = 0 } = color = { r: 255, g: 55 }
console.log(color);  // prints "{r: 255, g: 55}"

是否有一种单线解决方案来分配
r
g
b
,以及
color

您可以使用
Object.assign()
首先创建全色对象(包括它的所有3个部分),将结果分配给
color
变量并对其应用销毁:

let { r, g, b } = color = Object.assign({ r: 0, b: 0, g: 0 }, { r: 255, g: 55 });
console.log(r, g, b, color); // prints "255 55 0 {r: 255, b: 0, g: 55}"
不幸的是,这种方法在严格模式下会失败,因为它试图分配给未定义的
color
变量。解决这个问题的一个方法是,如果您对
color
绑定到
window
没有问题,那么直接分配到
window.color
(或者如果您在类/函数中执行此操作,当然可以绑定到
this.color

“严格使用”;
设{r,g,b}=window.color=Object.assign({r:0,b:0,g:0},{r:255,g:55});

控制台。日志(r、g、b、颜色);//打印“25550{r:255,b:0,g:55}”
这样做了,但我不相信这是你想要的:

设color=({r=0,g=0,b=0}={r:255,g:55},{r,g,b})


至于我相信你所期待的,我认为是不可能的。

这不符合你想要的精神,但你可以用逗号将它写在一行:

“严格使用”;
常数{r=0,g=0,b=0}={r:255,g:55},color={r,g,b};

控制台日志(颜色、r、g、b)否,创建新对象始终需要对象文字。另见。您的两行版本很好。这会在分配给未声明的变量时引发异常(或在草率模式下创建全局变量)。您不需要Object.assign-它等于
let{r,g,b}=color={r:255,g:55,b:0}。然而,主要的问题是
color
变成了一个全局变量(查看
window.color
)。如果您使用“严格模式”,您将得到
颜色未定义
错误。问题还在于用默认值填充可能缺少的键(
b
),这就是Object.assign的原因(
{r:255,g:55}
可能是某个函数参数)。关于全局
color
变量tho。。。