JS中如何使用对象作为函数参数?

How to use an object as a function parameter in JS?

我创建了一个函数,该函数应该 return 一个包含用户数据的对象。我希望该函数接受一个对象作为参数,并且我希望在函数内部定义该对象,并将所有值预定义为默认参数,以防它们未在函数调用时传递。示例代码只有 2 个值,但我需要传递超过 15 个值。我怎样才能实现这样的解决方案?

const userCreator = (name, age) => {
  if (name === undefined) {
    name = 'John'
  }
  if (age === undefined) {
    age = 25
  }
  return {
    name:name,
    age:age
  }
};

您应该直接在函数参数中定义默认值:

const userCreator = (name = 'John', age = 25) => {
  return {
    name: name,
    age: age
  }
};

...and I'd like this object to be defined inside the function with all the values pre-defined as default parameters in case they are not passed at a function call.

我想你是在说:

  • 您希望函数接受一个对象
  • 您希望该对象的所有属性都是可选的,默认值由函数指定

为此,您可以使用解构默认值。但另请参阅下文,因为在这种 特定 情况下,您想要 return 一个对象,您可能需要使用不同的方法。

但是让我们从没有默认值的基本解构开始,然后添加它们:

const userCreator = ({ name, age }) => {
//                   ^−−−−−−−−−−−^−−−−−−−−−−−−−−−− destructuring
    // ...stuff with `name` and `age` here...
    return {
        name,
        age,
    };
};

要为这些属性添加默认值,您可以在解构模式中添加它们({},否则参数名称将是):

const userCreator = ({ name = "John", age = 25, }) => {
//                         ^^^^^^^^^−−−−−^^^^^−−−− defaults for the properties
    return {
        name,
        age,
    };
};

如果有很多,最好分成几行:

const userCreator = ({
    name = "John",
    age = 25,
}) => {
    return {
        name,
        age,
    };
};

不过,该版本仍需要提供一个对象。如果要允许userCreator()(完全不传参数),需要给object参数添加一个默认参数值:

const userCreator = ({
    name = "John",
    age = 25,
} = {}) => {
//^^^^−−−−−−−−−−−−−−−−−−−−−−−−−−− default for the parameter
    return {
        name,
        age,
    };
};

如果根本没有提供参数,则使用 {} 作为默认值,如果不提供 name,则使用 "John" 作为默认值,而 25 作为如果未提供 age,则为默认值。由于默认 {} 上没有 nameage,因此当您执行 userCreator().

时它们会被默认

替代方法:

既然要return一个object,可以直接接受object参数,然后用属性spread或者Object.assign填defaults,像这样:

const userDefaults = {
    name: "John",
    age: 25,
};
const userCreator = (template) => {
    const result = {        // The result object we'll return
        ...userDefaults,    // Fill in defaults
        ...template         // Overwrite with any properties from the caller
    };
    // Or with `Object.assign` in older environments without property spread:
    //const result = Object.assign(
    //    {},                 // The result object we'll return
    //    userDefaults,       // Fill in defaults
    //    template            // Overwrite with any properties from the caller
    //);
    return result;
};

属性spread和Object.assign都忽略了nullundefined,所以如果根本没有传递任何对象,template就是undefined,以及