<分区>
克隆 JavaScript 对象的最有效方法是什么?我见过 obj = eval(uneval(o));
被使用,但是 that's non-standard and only supported by Firefox .
我做过obj = JSON.parse(JSON.stringify(o));
之类的事情,但质疑效率。
我也见过有各种缺陷的递归复制函数。
我很惊讶不存在规范的解决方案。
<分区>
克隆 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了解更多详情。
如果您不使用Date
、函数、undefined
、Infinity
、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用于基准。
由于克隆对象并不简单(复杂类型、循环引用、函数等),大多数主要库都提供了克隆对象的函数。 不要重新发明轮子 - 如果您已经在使用某个库,请检查它是否具有对象克隆功能。例如,
cloneDeep
;可以通过 lodash.clonedeep 单独导入模块,如果您还没有使用提供深度克隆功能的库,这可能是您的最佳选择angular.copy
jQuery.extend(true, { }, oldObject)
; .clone()
只克隆 DOM 元素just-clone
;只做一件事的零依赖 npm 模块库的一部分。
适合各种场合的无罪实用程序。关于javascript - 在 JavaScript 中深度克隆对象的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56731916/
相关文章:
javascript - 如何使用 javascript 将主要数据集链接到次要数据集?
javascript - 为什么 jQuery html() 方法向段落添加内容而不是替换内容?
javascript - Function.prototype.__proto__ 是什么意思?
java - "Java concurrency in practice"- 缓存的线程安全数字分解器( list 2.8)
javascript - 如何防止 document.write 超出 Div 框?
python - Python 中的线程 : class attribute (list) not thread-safe?