2017-08-29 46 views
3

我正在旋轉我的頭一陣子,但似乎我無法設法讓我的工作方式,我希望它。實際上,我想要的只是爲可選參數嵌套默認值。 我想看到的輸出應該是:解構和設置嵌套的默認值

55, 44, { sub1: '0', sub2: 55, sub3: 'all'} 

相反,我剛剛得到這個:

55, 44, { sub2: 55 } 

可能有人給我擡起頭,就這一個?

function foo({ param1=55, param2=44, param3:param3 = { sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' } } = { }) { 
    console.log(param1, param2, param3); 
} 

foo({ 
    param3: { 
    sub2: 55 
    } 
}); 
+2

沒有默認值,如果沒有被傳遞到該參數僅得到應用?我很肯定它不會運行'Object.assign'這樣的東西。 –

+0

如果你只是跳過'param3',整個默認對象就會進入遊戲。我真的不知道你是否可以像這樣嵌套默認值,找不到太多。 – jAndy

回答

4

你傳入{sub2: 55}param3,所以它不會評價的默認值{ sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' }(這是一個文字在這裏,而不是分配對象,所以不會做你認爲它反正)。

如果你想param3永遠是與3個屬性,從三個默認值的變量構造一個對象,你必須明確地建立它自己:如果參數是

function foo({param1=55, param2=44, param3: {sub1='0', sub2=200, sub3='all'} = {}} = {}) { 
    var param3 = {sub1, sub2, sub3}; 
    console.log(param1, param2, param3); 
} 
+0

換句話說,沒有辦法爲嵌套的解構參數創建默認值? – jAndy

+0

@jAndy不確定你的意思。您可以任意嵌套參數解構,並將默認值放在每個級別上。你不能做的是解構變異參數或創建新的對象,這些對象的部分是由默認值構成的。 – Bergi

+0

那麼,如果你在這個例子中通過'param3',它總是會覆蓋整個對象嗎?我想知道的一點是,如果您可以在傳遞的對象中再次創建默認值(它與外部基本相同,只是嵌套)。 但似乎你已經給出了這個問題的答案。無論如何,我想擁有該功能。 – jAndy

0

默認參數只能獲得分配空。我認爲你需要在函數體中使用Object.assign

const defaults = { sub1:sub1='0', sub2:sub2=200, sub3:sub3='all' } 
function foo({ param1=55, param2=44, param3 } = { }) { 
    const myParam3 = Object.assign({}, defaults, param3); 
    console.log(param1, param2, myParam3); 
} 

foo({ 
    param3: { 
    sub2: 55 
    } 
}); 
+0

你不需要'param3:param3 = defaults',只需'param3'就足夠了。然後,您還可以在Object.assign調用中內聯'defaults',並將其與第一個對象字面值合併。 – Bergi