使用JSON的javascript深度复制
我对javascript对象(数组)深度复制有问题。我读了很多处理这件事的好方法。我还知道jQuery有$扩展API来解决这个问题。但我的问题是:我能用JSON字符串化和解析方法来解决这个问题吗 这是我的密码:使用JSON的javascript深度复制,javascript,json,deep-copy,Javascript,Json,Deep Copy,我对javascript对象(数组)深度复制有问题。我读了很多处理这件事的好方法。我还知道jQuery有$扩展API来解决这个问题。但我的问题是:我能用JSON字符串化和解析方法来解决这个问题吗 这是我的密码: function deepCopy(oldValue) { var newValue strValue = JSON.stringify(oldValue) return newValue = JSON.parse(strValue) } var a = { b: '
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黑客应该可以。但是,如果对象很大,可能会遇到问题。如果它包含不可序列化的属性,那么这些属性将丢失:
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
您可以这样做,但由于上面列出的一些原因,这是有问题的:
我想你要找的是这样的东西: 如果您有一个真正的嵌套对象结构,那么要进行深度复制,可以使用JSON.stringify() 请参见以下示例:
var obj= {
'a':1,
'b':2,
'c': {
'd':{
'e' : 3
}
}
}
var newObj = {...obj};
var lastObj = JSON.parse(JSON.stringify(obj));
obj.c.d.e =19;
console.log('obj '+obj.c.d.e);
console.log('newObj '+obj.c.d.e);
console.log('lastObj'+lastObj.c.d.e);
现在lastObj确实与obj分离,而如果使用…(扩散)操作符,它也不适用于真正复杂的对象
希望这有帮助 并非所有对象都可以序列化为JSON。即使是这样,将它们转换为字符串然后解析字符串似乎也是无效的。但它应该可以正常工作。唯一的问题是旧版本的IE,你需要一个polyfill。检查这里谢谢!我只知道如果一个对象包含一个函数属性,那么它是不可序列化的。但如果在其他情况下,对象是不可序列化的?另一方面,使用JSON深度复制对象与正常方式相比是否真的效率低下?您的深度复制工作正常。并且正在按它应该的方式工作。一切都很好!这是在Chrome的控制台中快速调试的一个很好的解决方案,因为Chrome将始终显示对象的最终状态,而不是调用console.log函数时的状态。