如何在 JavaScript 中为通过对象字面量模拟的命名函数参数设置默认值?

How to set default values for named function parameters simulated via object literals in JavaScript?

我想在我的 JavaScript 函数中使用命名参数(通过对象文字模拟)以便于阅读。当我明确传递我的参数时,我编写的代码工作正常,但我在尝试设置默认值时遇到了问题,因此我的函数不仅可以通过 as myFunction({someBoolean:true}) 或 as myFunction 调用() 这意味着默认值为 someBoolean:false。

myFunction: function({myArgs}){
    myArgs.someBoolean = myArgs.someBoolean || false;
    if (myArgs.someBoolean) {
        [do stuff]
    }
    [do other stuff]
},

这在我调用 myFunction({someBoolean:true}) 时工作​​正常,但是当我调用 myFunction() 时,我得到 "Uncaught TypeError: Cannot read property 'someBoolean' of undefined."

提前致谢!

请注意,如果您需要多个默认参数并且提供了一些默认参数,则之前的答案将不起作用:

执行 myFunction({otherArg: 'hello'}) 不一定会将 myArgs.someBoolean 设置为 false。

相反,您应该将其更改为以下更改:

myFunction: function(myArgs){ // Switch to regular argument vs {myArgs}
    myArgs = myArgs || {}; // Make sure it provided

    myArgs.someBoolean = myArgs.someBoolean || false;
    myArgs.otherArg = myArgs.otherArg || 'defaultValue'
    if (myArgs.someBoolean) {
        [do stuff]
    }
    [do other stuff]
},

然后可以这样调用:something.myFunction({someBoolean: true, otherArg: '...'})

function x({myArgs}){}

用于对象解构,这样当传递带有 myArgs 属性 的对象时,您可以在函数内部使用 myArgs 作为变量。例如:

function x({myArgs}){
  console.log(myArgs);
}
x({myArgs: 5}); // logs 5

但是,您访问布尔值就像访问 myArgs (myArgs.someBoolean) 的对象 属性。那么你应该改用这个:

function x(myArgs = {someBoolean: false}){
  console.log(myArgs.someBoolean);
}
x({someBoolean: true}); // logs true
x(); // logs false

现在这符合您的情况。如果你想直接使用someBoolean,使用这个:

function x({someBoolean} = {someBoolean: false}){
  console.log(someBoolean);
}
x({someBoolean: true}); // logs true
x(); // logs false

另一种选择是

function x({someBoolean = false, someOtherBoolean = true} = {}){
  console.log(someBoolean);
}
x({someBoolean: true}); // logs true
x(); // logs false

Reference on MDN.

myFunction: function({someBoolean = false}){
    if (someBoolean) {
        [do stuff]
    }
    [do other stuff]
},

正确的方法是

function f({someBoolean = false} = {}){
  console.log(someBoolean)
}
f(); // false
f({}); // false
f({someBoolean: true}); // true

  • 如果没有传递参数,回退到{}

  • 析构参数或回退,提取someBoolean属性作为变量。如果没有这样的 属性,回退到 false.