【发布时间】:2017-09-13 23:12:39
【问题描述】:
以下是函数fn,其中预期结果是a、b、c 在每次调用fn 时定义,无论是否传递对象参数。如果传递了设置属性的对象,则应仅为该对象设置属性。
const fn = (opts = {a:1, b:2, c:3}) => console.log(opts);
当不带参数调用时,结果是
fn() // {a: 1, b: 2, c: 3}
当带参数调用时,例如{b:7},预期的结果是
fn({b:7}) // {a: 1, b: 7, c: 3}
然而,实际结果是
fn({b:7}) // {b: 7}
能够通过在函数外部定义对象并在函数主体内使用Object.assign()来获得预期结果
const settings = {a: 1, b: 2, c: 3};
const fn = opts => {opts = Object.assign({}, settings, opts); console.log(opts)}
fn({b: 7}) // {a: 1, b: 7, c: 3}
fn(); // {a: 1, b: 2, c: 3}
/*
// does not log error; does not return expected result
const fn = (opts = Object.assign({}, settings, opts)) => console.log(opts)
*/
是否可以仅使用默认参数来实现上述结果,而不定义要在函数参数外部或函数体内部引用的对象?
【问题讨论】:
-
我不认为。当您说默认参数值时,您指的是 1 个变量。所以当你传递
{b:7}时,JS 引擎会看到接收到的值并且不会使用默认值。您正在尝试设置参数属性的默认值。 -
@Rajesh 使用两个默认参数开发了一个解决方案,请参阅答案。
-
请注意,在函数内部声明变量绝对没有错。请不要滥用您的答案中的其他参数。
-
为什么不干脆做
const fn = opts => console.log(Object.assign({a: 1, b: 2, c: 3}, opts);- 根本不需要默认参数?我不确定你的actual problem 是什么。 -
@Bergi 问题和赏金在 OP 很明确。定义一个单一的默认参数,该参数是持久的并保持设置直到更改。如果在函数调用时没有传递参数,则返回默认对象。如果传递的参数与默认参数的属性匹配,则设置该属性的值;如果传递的属性和值未设置为默认参数,则该属性和值设置为默认参数。能够使用两个默认参数来实现要求。赏金是确定是否可以使用单个默认参数来实现要求