属性重命名本身不是浅拷贝,但可与浅拷贝天然配合:通过解构重命名({oldKey:newKey})提取目标字段,再用扩展运算符(...rest)保留其余字段,生成新对象实现带映射的浅拷贝。

属性重命名本身不是浅拷贝,但它可以和浅拷贝天然配合,在一次操作中完成字段映射转换——关键在于:用解构提取并重命名目标字段,再用扩展运算符保留其余字段,整体构成一个新对象,这个过程默认就是浅拷贝。
核心思路:解构 + 重命名 + 扩展
不新建空对象、不手动遍历,而是利用 ES6 解构赋值的重命名语法 { oldKey: newKey } 提取需改名的字段,同时用 ...rest 收集其他所有未被解构的属性。最终拼成的新对象,既完成了字段映射,又保持了原始结构的其余部分,且所有引用仍为浅层共享(符合浅拷贝定义)。
- 只对需要映射的字段做显式重命名,其余字段自动落入 rest 中,无需逐个列出
- 生成的新对象与原对象是两个独立对象(内存地址不同),但内部嵌套的对象/数组仍共用引用
- 适用于 API 响应格式适配、DTO 转换、组件 props 透传等常见场景
典型写法示例
假设后端返回:
const apiData = { id: 101, user_name: "Alice", created_at: 1715298000000, profile: { age: 28 } };前端需要映射为:
{ clientId: 101, name: "Alice", createdAt: Date, profile: { age: 28 } }可这样写:
const { id: clientId, user_name: name, created_at: timestamp, ...rest } = apiData;const mapped = {
clientId,
name,
createdAt: new Date(timestamp),
...rest
};
注意:createdAt 是类型转换,不影响浅拷贝性质;profile 未被解构,直接进入 rest,因此 mapped.profile 和 apiData.profile 指向同一对象。
与纯浅拷贝方法的区别
像 Object.assign({}, obj) 或 {...obj} 这类纯浅拷贝,只是复制全部字段,不做任何重命名或逻辑处理。而属性重命名驱动的映射转换,是在浅拷贝基础上叠加语义操作——它不是替代浅拷贝,而是“带业务逻辑的浅拷贝”。
- 纯浅拷贝:字段名、数量、嵌套关系完全一致
- 重命名映射:字段名变化、个别字段可加转换逻辑,其余保持原样
- 二者都只拷贝第一层,深层引用不变
注意事项
这种模式不适用于需要深拷贝的场景。如果映射后要修改 profile.age 且不希望影响原数据,就必须额外对嵌套对象做深拷贝(例如用 structuredClone 或 JSON 序列化)。但绝大多数字段映射需求只涉及顶层结构调整,浅拷贝已足够安全高效。










