JavaScript深拷贝函数实现异常,habbit与family字段结果错误求助
深拷贝函数失效的问题排查与修复
你的deepCopy函数失效的核心原因是循环变量k未使用let/const声明,导致它成为全局变量。在递归遍历嵌套结构(比如你的habbit数组里的子数组、family对象)时,这个全局变量会被后续的循环覆盖,最终导致遍历逻辑混乱,拷贝结果出错。
修复后的代码
const obj = { name : 'ABC', age : 18, habbit : ['baseball', 'football', ['genshin', 'princess']], family : { son : 'sp', father:'fa' } } const newObj = {} function deepCopy(obj, newObj){ // 给循环变量k添加const声明,避免全局污染 for(const k in obj){ // 排除原型链上的继承属性,只拷贝自身属性 if(obj.hasOwnProperty(k)){ if(Array.isArray(obj[k])){ const arr = [] deepCopy(obj[k], arr) newObj[k] = arr }else if(typeof obj[k] === 'object' && obj[k] !== null){ const oo = {} deepCopy(obj[k], oo) newObj[k] = oo }else{ newObj[k] = obj[k] } } } } deepCopy(obj, newObj) console.log(newObj)
关键修复点说明
- 声明循环变量:给
for...in的k添加const声明,确保每次循环的变量独立,不会被递归调用覆盖。 - 过滤继承属性:用
obj.hasOwnProperty(k)避免拷贝对象原型链上的非自身属性。 - 严谨的类型判断:
- 用
Array.isArray()替代instanceof Array,跨窗口/iframe场景下也能正确识别数组。 - 用
typeof obj[k] === 'object' && obj[k] !== null判断普通对象,排除null的干扰(typeof null会返回object)。
- 用
修复后,newObj的habbit数组和family对象都会被正确深拷贝,修改原对象的嵌套结构不会影响拷贝后的结果。
内容的提问来源于stack exchange,提问作者LOSHI
相关产品推荐
相关产品推荐

