这段实现深拷贝的代码为什么会出错呢

这段实现深拷贝的代码为什么会出错呢?
暂时没有考虑会传进去,null,正则对象等

function deepclone(target) {

            let Tclass = target.constructor
            let cloneObject = new Tclass;

            for (let key in target) {

                if (target.hasOwnProperty(key)) {
                    cloneObject[key] = deepclone(target[key])
                }

            }
            return cloneObject
        }

        let obj = {
            name: 'wc',

            age: 18,
            address: {
                city: 'bj'
            },
            arr: [1, 2, 3]
        }


        let newobj = deepclone(obj)
        console.log(newobj);

最后多次测试发现还是要加一个判断,不然会一直递归然后爆栈


 if (typeof obj !== 'object' || obj === null) {
                return obj;
            }
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7793687
  • 以下回答来自chatgpt:

    在深拷贝过程中,如果不考虑特殊情况传入null、正则对象等,可能会出现一些问题。为了避免这些问题,可以增加针对这些特殊情况的处理。具体方法如下:

    1. 针对null值,可以直接返回null。
    if (obj === null) return null;
    
    1. 针对正则对象,可以使用正则对象的构造函数进行深拷贝。
    if (obj instanceof RegExp) {
      return new RegExp(obj);
    }
    
    1. 对于其他的数据类型,可以使用递归函数进行深拷贝。
    const deepCopy = function (obj) {
      if (typeof obj !== "object") {
        return obj;
      }
      if (Array.isArray(obj)) {
        return obj.map((item) => deepCopy(item));
      }
    
      let newObj = {};
      for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
          newObj[key] = deepCopy(obj[key]);
        }
      }
      return newObj;
    };
    

    通过以上的处理方法,可以避免在深拷贝代码中出现null、正则对象等特殊情况的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^