Native deep cloning
现在有了一个名为"structured cloning"的JS标准,它在Node 11和更高版本中实验性地工作,将在浏览器中使用,它有polyfills for existing systems个.
structuredClone(value)
如果需要,首先加载polyfill:
import structuredClone from '@ungap/structured-clone';
有关更多详细信息,请参见this answer.
Older answers
数据丢失的快速克隆——JSON.解析/字符串化
如果在对象中不使用Date
、函数、undefined
、Infinity
、regexp、映射、集合、Blob、文件列表、ImageData、稀疏数组、类型化数组或其他复杂类型,深度克隆对象的一个非常简单的单行程序是:
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.
使用库进行可靠克隆
由于克隆对象并不简单(复杂类型、循环引用、函数等),大多数主要库都提供克隆对象的函数.Don't reinvent the wheel-如果你已经在使用一个库,判断它是否有对象克隆功能.例如
ES6 (shallow copy)
为了完整性,请注意ES6提供了两种浅层复制机制:Object.assign()
和spread syntax.
它将所有可枚举的OWN属性的值从一个对象复制到另一个对象.例如:
var A1 = {a: "2"};
var A2 = Object.assign({}, A1);
var A3 = {...A1}; // Spread Syntax