我对javascript对象(数组)深度复制有问题.我读了很多很好的应对方法.我还知道jQuery有美元.将API扩展到这个问题.但我的问题是:我能用JSON字符串化和解析方法来解决这个问题吗?

以下是我的代码:

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);

Yields:

Object {a: 1, b: 2}

Interestingly enough, a fair number of deep-copy solutions in C# are similar serialization/deserialization tricks.

Addendum:不确定你希望在复制后比较对象.但是,对于复杂的对象,通常需要编写自己的Compare()和/或Equals()方法来进行精确比较.

同样值得注意的是,这种副本不会保留类型信息.

JSON.parse(JSON.stringify(new A())) instanceof A === false

Json相关问答推荐

集成wix.comstore API|变音符号问题

XSLT 3.0 Json-to-xml,json 包含 html struct

(已回答)JSON 读取函数返回未定义而不是预期值 - Typescript

如何对未知/变量键的字典进行编码?

jq :遍历 json 并在键存在时检索集合

将来自 Golang 的 JSON API 调用响应输出到 nextjs 前端

如何在jolt中使用shift和modify-overwrite-beta

如何从 json 中获取单个元素?

JQ 中的样本标准偏差

Go - JSON 验证抛出错误,除非我在 struct 中使用指针.为什么?

如果 jq 数组中的字符串是对象或字符串,则获取值

如何使用 Swiftui 判断 JSON 是否缺少键值对

从 JSON 对象中删除键值对

如何使用 Newtonsoft.Json 反序列化 JSON 数组

Spring MVC控制器中的JSON参数

ASP.NET MVC:使用 JsonResult 控制属性名称的序列化

JSON.NET JsonConvert 与 .NET JavaScriptSerializer

使用 Codable 序列化为 JSON 时的 Swift 字符串转义

python追加到json对象中的数组

Javascript:如何判断 AJAX 响应是否为 JSON