javascript - 我们可以设置持久的默认参数,在明确更改之前保持设置吗?

标签 javascript ecmascript-6

下面是一个函数fn,其中abc 的预期结果定义在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)
 
*/

是否可以仅使用默认参数来实现上述结果,而无需在函数参数外部或函数体内定义一个对象来引用?

最佳答案

也许我误解了这个问题,但您似乎正在为每个单独的属性寻找默认初始化程序。为此,您必须使用解构:

const fn = ({a = 1, b = 2, c = 3} = {}) => console.log({a, b, c});

如果您想保留任意属性,而不仅仅是那些您预先知道的属性,您可能会对 object rest/spread properties proposal 感兴趣可以让你写

const fn = ({a = 1, b = 2, c = 3, ...opts} = {}) => console.log({a, b, c, ...opts});

Can an opts variable as the single object reference be achieved solely utilizing default parameters, without defining an object to reference outside of function parameters or within function body?

没有。参数声明只能使用(部分)参数初始化变量,并且可能(作为语法糖)在没有或 undefined 参数(部分)被传递时使用默认值。它们无法执行无条件计算并创建从结果初始化的变量 - 这正是您在此处尝试实现的目标。

你应该为此使用函数体。

关于javascript - 我们可以设置持久的默认参数,在明确更改之前保持设置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43466657/

相关文章:

javascript - 在 JavaScript 中使用 `for..of` 获取键/值

javascript - 在 Node.JS 中刷新缓冲区数据

javascript正则表达式选择带引号的字符串但不转义引号

javascript - 删除 jstree 中的根节点会分离事件监听器

javascript - Typescript 对象中的两个字段(从字符串到 float )

javascript - 使用可以从构造函数实例访问 this 的方法将函数添加到构造函数原型(prototype)

javascript - SVG 不位于 div/tab(li) 内

javascript - 选项卡中的嵌套选项卡( Bootstrap )

javascript - Javascript 可迭代对象的技术定义是什么?您如何测试它?

javascript - 使用字符串中数组的每个元素组成标准化的句子