浅拷贝可防止函数内修改对象顶层属性污染原始对象,但嵌套对象仍共享引用;常用方法包括object.assign({}, obj)、{...obj}和structuredclone(obj),需注意特殊值处理及深层嵌套限制。

在函数传参时用浅拷贝防止对象被污染,核心是避免函数内部修改参数影响原始对象——但要注意:浅拷贝只防第一层修改,嵌套对象仍共享引用。
为什么传参默认会“污染”原对象
JavaScript 中对象作为参数传递时,实际传的是引用地址。函数内直接修改对象属性(如 obj.name = 'new')会同步反映到外部。这不是“传参问题”,而是引用类型本身的特性。
常用浅拷贝方式及适用场景
以下方法都适用于函数入参前快速生成一层隔离:
- Object.assign({}, obj):兼容性好,适合老项目;注意第一个参数必须是空对象,否则会改写目标
- {...obj}(展开运算符):语法简洁,ES6+ 推荐;不支持 Symbol 属性和不可枚举属性
- structuredClone(obj)(现代浏览器):严格意义是深拷贝,但对多数普通对象效果等同于安全浅拷贝;支持 Map、Set、Date 等,且无 JSON 方法的限制
关键注意事项
浅拷贝不是万能解药,尤其要注意这些陷阱:
- 嵌套对象(如 obj.user.address)不会被复制,修改它仍会影响原对象
- 函数、undefined、Symbol、RegExp、Date 等特殊值在 JSON 方法中会丢失或出错,不要用 JSON.parse(JSON.stringify()) 做参数保护
- 如果函数逻辑只读取或仅修改顶层字段(如配置项 timeout、method),浅拷贝足够安全
推荐写法示例
把浅拷贝逻辑封装进函数签名更清晰:
function handleSubmit(data) {
const safeData = { ...data }; // 或 Object.assign({}, data)
safeData.timestamp = Date.now();
// 后续只操作 safeData,原始 data 不受影响
api.post('/form', safeData);
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











