javascript参数均为按值传递,基本类型传数据副本,引用类型传地址副本;规避共享需拷贝:浅拷贝适用于单层结构(如{...obj}),深拷贝用于嵌套对象(推荐structuredclone)。

JavaScript 中没有真正的“引用传递”,所有参数都是按值传递的——但这个“值”对基本类型是数据本身,对引用类型是内存地址。所谓“规避引用传递的影响”,实际是避免多个变量意外共享同一对象,核心在于切断地址共享,也就是做拷贝。
什么时候需要拷贝?
当你不希望函数内部或赋值操作修改原对象时,就需要主动拷贝。典型场景包括:
- 传入函数的对象被函数内部修改(如添加属性、改数组元素)
- 将一个对象赋值给多个变量,又想让它们彼此独立
- 在状态管理(如 React、Vuex)中避免直接修改原始 state
- 深嵌套对象中某一层被意外改动,导致上游数据污染
浅拷贝:只断开第一层引用
适用于对象/数组只有一层结构,且内部不含其他对象或数组的情况。它复制的是顶层属性的值,对基本类型是真拷贝,对嵌套的引用类型仍共享地址。
-
对象:用
Object.assign({}, obj)、{...obj}或structuredClone(obj)(较新 API) -
数组:用
arr.slice()、[...arr]、Array.from(arr) - 注意:
JSON.parse(JSON.stringify(obj))可应急浅拷贝,但会丢失函数、undefined、Symbol、Date、RegExp 等,且无法处理循环引用
深拷贝:彻底切断所有层级的引用
当对象有嵌套结构(比如对象里有数组,数组里又有对象),必须递归拷贝每一层,才能真正隔离修改。
- 推荐使用
structuredClone(obj)(现代浏览器和 Node.js ≥17.0 支持),它能正确处理 Map、Set、Date、RegExp、Blob 等,并支持循环引用 - 兼容性要求高时,可用 Lodash 的
_.cloneDeep(obj) - 手写递归深拷贝需谨慎处理 null、Date、RegExp、函数、原型链等边界情况,容易出错,不建议生产环境自研
函数内传参时的“规避”技巧
传参本身无法改变 JS 的传递机制,但你可以控制函数内部行为:
- 函数开头就对参数做浅/深拷贝,后续所有操作都在副本上进行
- 明确约定函数不修改入参,只返回新对象(纯函数风格),例如
return { ...obj, a: newValue } - 对数组类参数,避免用
push/splice原地修改,改用concat、filter、map等返回新数组的方法
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











