javascript - 在 JavaScript 中深度克隆对象的最有效方法是什么?

标签 javascript object clone

<分区>

克隆 JavaScript 对象的最有效方法是什么?我见过 obj = eval(uneval(o)); 被使用,但是 that's non-standard and only supported by Firefox .

我做过obj = JSON.parse(JSON.stringify(o));之类的事情,但质疑效率。

我也见过有各种缺陷的递归复制函数。
我很惊讶不存在规范的解决方案。

最佳答案

原生深度克隆

现在有一个 JS 标准叫做 "structured cloning" ,在 Node 11 及更高版本中进行实验性工作,将登陆浏览器,并且具有 polyfills for existing systems .

structuredClone(value)

如果需要,首先加载 polyfill:

import structuredClone from '@ungap/structured-clone';

参见 this answer了解更多详情。

较早的答案

数据丢失的快速克隆 - JSON.parse/stringify

如果您不使用Date、函数、undefinedInfinity、RegExp、Maps、Sets、Blob、FileLists、ImageDatas,对象中的稀疏数组、类型化数组或其他复杂类型,深度克隆对象的一种非常简单的方式是:

JSON.parse(JSON.stringify(object))

const a = {
  string: 'string',
  number: 123,
  bool: false,
  nul: null,
  date: new Date(),  // stringified
  undef: undefined,  // lost
  inf: Infinity,  // forced to 'null'
  re: /.*/,  // lost
}
console.log(a);
console.log(typeof a.date);  // Date object
const clone = JSON.parse(JSON.stringify(a));
console.log(clone);
console.log(typeof clone.date);  // result of .toISOString()

参见 Corban's answer用于基准。

使用库进行可靠克隆

由于克隆对象并不简单(复杂类型、循环引用、函数等),大多数主要库都提供了克隆对象的函数。 不要重新发明轮子 - 如果您已经在使用某个库,请检查它是否具有对象克隆功能。例如,

关于javascript - 在 JavaScript 中深度克隆对象的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56731916/

相关文章:

Javascript 日期范围与月份重叠

javascript - 如何使用 javascript 将主要数据集链接到次要数据集?

javascript - 为什么 jQuery html() 方法向段落添加内容而不是替换内容?

javascript - Function.prototype.__proto__ 是什么意思?

java - "Java concurrency in practice"- 缓存的线程安全数字分解器( list 2.8)

vb6 - 如何在VB6中克隆一个对象

javascript - 如何防止 document.write 超出 Div 框?

java - 你能告诉我这个程序是如何运作的吗?

python - Python 中的线程 : class attribute (list) not thread-safe?

具有父类(super class)和子类的 Java 克隆