使用JSON的javascript深拷贝

 淘美国 发布于 2023-02-09 13:59

我有javascript对象(数组)深拷贝的问题.我读了许多处理它的好方法.我也知道jQuery有这个问题的$ .extend API.但我的问题是:我可以只使用JSON stringify和parse方法来解决这个问题吗?

这是我的代码:

function deepCopy(oldValue) { 
  var newValue
  strValue = JSON.stringify(oldValue)
  return newValue = JSON.parse(strValue)
}

var a = {
  b: 'b',
  c: [1,2,4],
  d: null
}

copy = deepCopy(a)

console.log(a === copy) // false
console.log(a.c === copy.c) // false

PS:我知道如果没有所有对象都是可序列化的,但我知道的唯一情况是当对象包含一个属性是函数时.还有其他情况吗?

1 个回答
  • 如果您的对象是"小"并且只包含可序列化的属性,那么使用JSON序列化的简单deepCopy hack应该没问题.但是,如果你的对象很大,你可能会遇到问题.如果它包含不可序列化的属性,那些将丢失:

    var o = {
     a: 1,
     b: 2,
     sum: function() { return a + b; }
    };
    
    var o2 = JSON.parse(JSON.stringify(o));
    console.log(o2);
    

    产量:

    Object {a: 1, b: 2}
    

    有趣的是,C#中的大量深层复制解决方案是类似的序列化/反序列化技巧.

    附录:在复制后比较对象时,不确定您希望做什么.但是,对于复杂对象,通常需要编写自己的Compare()和/或Equals()方法以进行准确比较.

    另外值得注意的是,这种副本不保留类型信息.

    JSON.parse(JSON.stringify(new A())) instanceof A === false
    

    2023-02-09 14:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有