可借助Object.keys()获取对象自有可枚举属性名,再用forEach遍历白名单数组,只拷贝指定键对应值,实现轻量可控的浅拷贝;白名单决定“拷什么”,不校验属性是否存在,适合接口契约明确场景。

可以借助 Object.keys() 获取对象自有可枚举属性名,再用 forEach 遍历白名单数组,只拷贝指定键对应的值,实现轻量、可控的浅拷贝。
明确白名单并提取目标键值对
白名单是一个字符串数组,列出你允许保留的属性名。先用 Object.keys() 拿到源对象的全部自有可枚举键,但真正拷贝时只响应白名单中的项——不查源对象是否真有该属性,而是以白名单为“指令”,逐个读取并赋值(若源对象无对应属性,则拷贝 undefined)。
- 白名单决定“拷什么”,不是“过滤掉什么”
- 适合字段语义固定、接口契约明确的场景(如只取 API 响应里的
id、name、status) - 不依赖
in或hasOwnProperty判断存在性,简化逻辑
用 forEach 驱动赋值,避免 for 循环冗余
forEach 天然适配白名单遍历:每轮拿到一个允许的键,直接从原对象取值、写入新对象。相比 for...of 或传统 for,代码更简洁,意图更清晰。
- 无需手动维护索引,减少出错可能
- 不返回新数组,专注副作用(赋值),语义干净
- 示例:
whitelist.forEach(key => result[key] = source[key])
封装成可复用函数,支持默认白名单
把逻辑收进函数,第一个参数是源对象,第二个是白名单数组;可设默认白名单(如空数组或常用字段),提升调用便利性。注意始终返回新对象,不修改原对象。
- 函数内用字面量
{}创建空目标对象 - 白名单为空数组时,返回空对象,符合直觉
- 可加简单类型校验(如非对象则返回
{}),增强鲁棒性
注意浅拷贝边界:嵌套对象仍共享引用
这个方法只复制第一层属性值。如果白名单里某个键对应的是对象或数组,拷贝后新旧对象中该属性仍指向同一内存地址——修改嵌套内容会影响双方。
- 这是浅拷贝的本质限制,不是实现缺陷
- 如需深拷贝,应在赋值时对值做额外判断和递归处理(或用
structuredClone等) - 日常多数“字段筛选”场景下,浅拷贝已足够,且性能更好


















