JSON.parse(JSON.stringify())实现深拷贝的缺点

使用 JSON.parse(JSON.stringify()) 实现深拷贝是一种简单易用的方法,但也存在以下缺点:

  1. 无法处理函数和 undefined
    JSON.stringify() 方法无法处理 JavaScript 中的函数和 undefined 值,这些值会被忽略掉,因此在使用该方法时需要注意。
  2. 无法处理循环引用
    如果原始对象中存在循环引用,即对象的某个属性引用了该对象本身,使用该方法就会抛出 TypeError 异常。
    const obj = {
      a: 1,
      b: {
        c: 2
      }
    };
    obj.d = obj;
    
    // 报错:TypeError: Converting circular structure to JSON
    JSON.parse(JSON.stringify(obj));
    
  3. 无法处理一些特殊对象
    JSON.stringify() 方法无法处理某些特殊的 JavaScript 对象,如 RegExp、Error、Date 等,这些对象会被转换成空对象。
    const obj = {
      a: /abc/,
      b: new Error('error'),
      c: new Date()
    };
    
    const newObj = JSON.parse(JSON.stringify(obj));
    console.log(newObj); // { a: {}, b: {}, c: '2022-02-22T12:34:56.000Z' }
    
  4. 对象的原型链上的属性会丢失
    如果原始对象的某个属性是通过原型链继承的,那么使用该方法得到的新对象会丢失该属性。
    function Person(name) {
      this.name = name;
    }
    
    Person.prototype.sayHi = function() {
      console.log(`Hi, I'm ${this.name}`);
    };
    
    const obj = new Person('Tom');
    const newObj = JSON.parse(JSON.stringify(obj));
    
    newObj.sayHi(); // 报错:Uncaught TypeError: newObj.sayHi is not a function
    

综上,虽然 JSON.parse(JSON.stringify()) 方法是一种简单易用的实现深拷贝的方法,但它并不完美,使用时需要注意其缺陷。对于需要处理函数、循环引用等复杂情况的对象,可以使用其他方法来实现深拷贝。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端代码军师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值