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

webghufk  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(104)

使用JSON.parse(JSON.stringify(obj))是一个老把戏,我已经看到了很多用于深度复制对象。它创建了一个真正的'深度复制'的对象吗?性能方面,它被认为是明智的使用?

bzzcjhmw

bzzcjhmw1#

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

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

因为函数不是JSON可序列化的,所以不能被正确复制。还有很多其他的问题,比如循环引用。这只适用于简单的普通对象,因此不是一个特别好的解决方案。我建议检查像下划线或长划线这样的东西来实现高性能的深度复制。

lp0sw83n

lp0sw83n2#

JSON.parse(JSON.stringify(obj))存在一些问题
对于大多数开发人员来说,主要的问题是丢失不属于JSON spec的任何内容

  • 所有内部getter和setter都将丢失。
  • 销毁日期对象(日期将转换为字符串
  • 类原型将丢失。

JSON方法在解析循环引用时也会抛出异常。
也就是说它确实有一些优势:

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

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

相关问题