You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修复点说明

  1. 声明循环变量:给for...in的k添加const声明,确保每次循环的变量独立,不会被递归调用覆盖。
  2. 过滤继承属性:用obj.hasOwnProperty(k)避免拷贝对象原型链上的非自身属性。
  3. 严谨的类型判断:
    • 用Array.isArray()替代instanceof Array,跨窗口/iframe场景下也能正确识别数组。
    • 用typeof obj[k] === 'object' && obj[k] !== null判断普通对象,排除null的干扰(typeof null会返回object)。

修复后,newObj的habbit数组和family对象都会被正确深拷贝,修改原对象的嵌套结构不会影响拷贝后的结果。

内容的提问来源于stack exchange,提问作者LOSHI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:37:10