2017-10-21 35 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);