2017-10-21 57 views
3

ES6引入的destructuring assignment句法支持从对象拆包值:同时使用解构赋值分配到新的可变

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

+2

没有,创建一个新的对象总是需要的对象文字。另请参阅[单线程从ES6中的对象获取一些属性](https://stackoverflow.com/q/25553910/1048572)。你的双线版本就好了。 – Bergi

回答

4

你可以使用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)。

'use strict'; 
 

 
let { r, g, b } = window.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}"

+0

你不需要Object.assign - 它等于'let {r,g,b} = color = {r:255,g:55,b:0};'。但是,主要的问题是'color'变成了一个全局变量(查看'window.color')。如果你使用'严格模式',你会得到'颜色未定义'的错误。 –

+0

那么这个问题也是关于用缺省值填充可能丢失的键('b'),这就是Object.assign('{r:255,g:55}''将会是一些函数参数或可能)的原因。你是对的全球'颜色'变量tho ... –

0

该做的,但我不相信这是你所要求的:

设色=({R = 0,G = 0,B = 0} = {r:255,g:55},{r,g,b});

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

+1

当分配给未声明的变量时,这将抛出一个异常(或在马虎模式下创建全局变量)。 – Bergi

1

这不是你想要什么精神,但你总是可以用逗号把它写在一行:

'use strict'; 
 

 
const { r = 0, g = 0, b = 0 } = { r: 255, g: 55 }, color = { r, g, b }; 
 

 
console.log(color, r, g, b);

相关问题