【问题标题】:What are the dangers of Deep-copying objects using JSON.parse(JSON.stringify(obj))?使用 JSON.parse(JSON.stringify(obj)) 深度复制对象有什么危险?
【发布时间】:2018-01-29 04:21:47
【问题描述】:

使用JSON.parse(JSON.stringify(obj)) 是我见过的一个老技巧,它经常用于深度复制对象。 它是否创建了对象的真正“深拷贝”? 在性能方面,使用它是否明智?

【问题讨论】:

标签: javascript json object


【解决方案1】:

使用这种方法深度复制对象的最大问题是对象必须是 JSON 可序列化的。例如以下对象:

let obj = {
    func: function() {
        console.log("hello world!");
    }
}

由于函数不是 JSON 可序列化的,因此无法正确复制。还有许多其他问题,例如循环引用。这实际上只适用于简单、普通的对象,因此不是一个特别好的解决方案。我建议使用下划线或 lodash 之类的东西来进行高性能深度复制。

【讨论】:

    【解决方案2】:

    JSON.parse(JSON.stringify(obj)) 存在一些问题

    大多数开发人员的主要问题是丢失任何不属于JSON spec的东西

    • 任何内部的 getter 和 setter 都将丢失。
    • 日期对象的销毁(日期将被转换为字符串
    • 类原型将会丢失。

    JSON 方法在解析循环引用时也会抛出异常。

    也就是说它确实有一些优势:

    • JSON 方法的原始速度胜过benchmarks 中的最浅拷贝方法
    • 由于浏览器中的本机实现与库不同,它不需要发送到客户端,这也可能加快页面加载时间。

    就创建对象的真正深层副本而言...这将是真正的深层副本,因为它将尽可能多地进入对象,它不会丢弃某些信息,如上所述。

    【讨论】:

      猜你喜欢
      • 2017-06-10
      • 2014-09-11
      • 1970-01-01
      • 2021-04-16
      • 2019-05-10
      • 2012-08-30
      • 1970-01-01
      • 2021-08-30
      • 2012-12-01
      相关资源
      最近更新 更多