gpt4 book ai didi

使用 JSON 的 javascript 深复制

转载 作者:行者123 更新时间:2023-12-03 02:03:06 26 4
gpt4 key购买 nike

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

关于使用 JSON 的 javascript 深复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com