使用JSON.parse(JSON.stringify(obj))深度复制对象有什么危险?

时间:2018-01-29 04:21:47

标签: javascript json object

使用JSON.parse(JSON.stringify(obj))是一个老技巧,我已经看到它用于深度复制对象。 它是否创造了一个真正的深层复制品。一个物体? 在性能方面,使用它是否明智?

2 个答案:

答案 0 :(得分:3)

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

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

由于函数不是JSON可序列化的,因此无法正确复制。还有许多其他问题,例如循环引用。这实际上只适用于简单的普通物体,因此不是一个特别好的解决方案。我建议你查看一些像下划线或lodash这样的高性能深度复制。

答案 1 :(得分:1)

JSON.parse(JSON.stringify(obj))

存在一些问题

大多数开发人员面临的主要问题是丢失了不属于JSON spec

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

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

那说它确实有一些优势:

  • 原始速度JSON方法胜过benchmarks
  • 中的大多数浅层复制方法
  • 由于浏览器中的本机实现与库不同,因此不需要将其发送到客户端,这可能也会加快页面加载时间。

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