使用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