Javascript 在同时使用解构赋值的同时赋值给新变量
ES6引入了支持从对象解包值的语法: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
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。。。