将带有可选/默认属性的对象作为参数的函数?

Ian*_*Ian 5 javascript syntax default-value ecmascript-6

我知道,使用ES6语法,可以创建一个将对象作为参数的函数,并且该参数可以具有默认值,如下所示:

function exampleFunction(objParam = {val1: 1, val2: 2}) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

如果我呼叫exampleFunction()objParam则提供默认值。但是,如果我打电话给exampleFunction({val1: 3})objParam.val2undefined。这很有意义,因为未应用默认设置。objParam.val2使用ES6表示法,有什么方法可以确保它具有价值吗?我知道我可以在函数中添加检查,但这会导致代码不一致,而我宁愿不这样做。

编辑:为了澄清,这是一个更好的示例:

function exampleFunction(param = 0, objParam = {val1: 1, val2: 2}) {
    return objParam.val1;
}
exampleFunction(); // Returns 1 (this is good)
exampleFunction(1, {val1: 2}); // Returns 2 (this is good)
exampleFunction(1, {val2: 3}); // Returns undefined (I want it to return 1)
Run Code Online (Sandbox Code Playgroud)

这是我目前拥有的东西,它确实有效,但有点不雅致:

function exampleFunction(param = 0, objParam = {val1: 1, val2: 2}) {
    if(objParam.val1 === undefined) objParam.val1 = 1
    if(objParam.val2 === undefined) objParam.val2 = 2
    ...
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 11

您可以在参数中使用解构来提供默认值:

function exampleFunction({val1 = 1, val2 = 2} = {}) {
  console.log(val1, val2);
}
exampleFunction({val1: 5});
exampleFunction();
Run Code Online (Sandbox Code Playgroud)

如果要将参数保留为对象,可以使用Object.assign

function exampleFunction(origParams = {}) {
  const objParam = Object.assign({ val1: 1, val2: 2 }, origParams);
  console.log(objParam.val1, objParam.val2);
}
exampleFunction({val1: 5});
exampleFunction();
Run Code Online (Sandbox Code Playgroud)


Sam*_*Sam 7

可能没有你想要的那么干净,但你可以这样做

function exampleFunction(objParams) {
  const defParams = { val1: 1, val2: 2 };

  const finalParams = { ...defParams, ...objParams }
  // final params takes the default params and overwrites any common properties with incoming params

  // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,并且比国际海事组织接受的答案更干净 (2认同)