我有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