• JS 采用JSON.parse实现深拷贝时出现的问题?


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

    1. 无法处理函数和 undefined

    JSON.stringify() 方法无法处理 JavaScript 中的函数和 undefined 值,这些值会被忽略掉,因此在使用该方法时需要注意。

    let obj = {
      name: 'wyc',
      age: undefined,
      foo: function() {
        console.log('我是foo');
      },
    }
    let obj2 = JSON.parse(JSON.stringify(obj))
    console.log(obj);
    console.log(obj2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    2. 无法处理循环引用

    如果原始对象中存在循环引用,即对象的某个属性引用了该对象本身,使用该方法就会抛出 TypeError 异常。

    const obj = {
      a: 1,
      b: {
        c: 2
      }
    };
    obj.d = obj;
     
    // 报错:TypeError: Converting circular structure to JSO
    console.log(JSON.parse(JSON.stringify(obj)));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    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' }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

  • 相关阅读:
    K8S的pod创建过程
    基于springboot+vue的实验室耗材管理系统(前后端分离)
    Selenium 遇见伪元素该如何处理?
    剑指 Offer 03. 数组中重复的数字
    ubuntu21.04 + 编译 debian11 报错解决过程
    你了解Postman 变量吗?
    Flink Transformation
    在Spring中使用Redis
    Lesson 6 重构代码
    如何试用 Vectorizer.AI 将位图转换为矢量图
  • 原文地址:https://blog.csdn.net/wu_2004/article/details/133032463