2017-08-29 43 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