You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更优地为生成用户对象的函数设置默认参数

更简洁的用户对象生成方案

你不需要逐个声明参数和返回属性,利用对象展开运算符就能大幅简化代码,同时保留自定义覆盖默认值的能力,完美解决30个属性带来的繁琐维护问题。

基础优化版本

直接通过对象合并实现,让传入的自定义属性自动覆盖默认对象的同名键:

const defaultUser = {
  id: 'test_id',
  last_time: '17:59:00',
  slide_id: 'slide ID',
  name: 'AA1',
  address: 'blabala',
  number_of_houses: 500,
  age: 20,
  active: false,
  children: {
    boy: [],
    girl: []
  },
};

const generateUser = (customProps = {}) => {
  // 先展开默认对象,再用自定义属性覆盖同名属性
  return { ...defaultUser, ...customProps };
};

// 使用示例
const user = generateUser(); // 完全使用默认值生成用户
const secondUser = generateUser({ name: 'test_2' }); // 仅覆盖name属性

这个写法的核心优势:

  • 新增/删除默认属性时,只需要修改defaultUser对象,无需改动函数参数和返回值
  • 自定义属性自动覆盖默认值,逻辑直观易懂
  • 代码量骤减,彻底告别冗长的参数列表

处理嵌套对象的深拷贝问题

如果默认对象包含嵌套结构(比如children),上面的浅拷贝会导致修改嵌套属性时污染原defaultUser。比如直接修改生成用户的children.boy,会连带改变默认对象的对应属性。此时需要用深合并来避免引用共享:

const generateUser = (customProps = {}) => {
  // 递归实现深合并,确保嵌套对象完全独立
  const deepMerge = (target, source) => {
    const merged = { ...target };
    for (const key in source) {
      if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
        merged[key] = deepMerge(target[key], source[key]);
      } else {
        merged[key] = source[key];
      }
    }
    return merged;
  };
  return deepMerge(defaultUser, customProps);
};

// 测试:修改生成用户的嵌套属性不会污染默认对象
const fourthUser = generateUser();
fourthUser.children.boy.push('小红');
console.log(defaultUser.children.boy); // 输出空数组,不受影响

额外优化:TypeScript类型提示(可选)

如果是TypeScript项目,可以给默认对象定义类型,让生成函数获得精准的属性提示,避免拼写错误:

type User = typeof defaultUser;

const defaultUser: User = {
  // 同默认对象结构
};

const generateUser = (customProps?: Partial<User>): User => {
  return { ...defaultUser, ...customProps };
};

内容的提问来源于stack exchange,提问作者aviv.L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:45:06