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

Javascript 使用JSON.parse(JSON.stringify(obj))深度复制对象有什么危险?,javascript,json,object,Javascript,Json,Object,使用JSON.parse(JSON.stringify(obj))是我见过的一个用于深度复制对象的老把戏。 它是否创建了一个真正的对象“深度副本”? 就性能而言,使用此方法是否明智?使用此方法深度复制对象的最大问题是该对象必须是JSON可序列化的。例如,以下对象: let obj = { func: function() { console.log("hello world!"); } } 无法正确复制,因为函数不可JSON序列化。还有许多其

使用
JSON.parse(JSON.stringify(obj))
是我见过的一个用于深度复制对象的老把戏。 它是否创建了一个真正的对象“深度副本”?
就性能而言,使用此方法是否明智?

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

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

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

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

对于大多数开发人员来说,主要的问题是失去了任何不属于项目的东西

  • 任何内部getter和setter都将丢失
  • 销毁日期对象(日期将转换为字符串
  • 类原型将丢失
JSON方法在解析循环引用时也会引发异常

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

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

就创建对象的真正深度副本而言……它将是一个真正的深度副本,因为它将尽可能多地深入对象,而不会像上面所述那样丢弃某些信息。

在很多情况下对性能不明智,如果对象具有循环引用,则有引发堆栈溢出的风险.可能的副本