编程语言
首页 > 编程语言> > 使用JSON的javascript深拷贝

使用JSON的javascript深拷贝

作者:互联网

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

解决方法:

如果您的对象是“小”并且只包含可序列化的属性,那么使用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

标签:javascript,json,deep-copy
来源: https://codeday.me/bug/20190930/1834710.html