Skip to content

deepClone (深拷贝)

deepClone 函数用于深拷贝一个值,包括基本数据类型、对象、数组、日期、正则表达式、Map 和 Set 等。此函数能够处理循环引用的情况,确保每个对象只被拷贝一次。

函数调用方式

javascript
deepClone(value)

参数说明

参数名类型描述
valueAny要进行深拷贝的值,可以是任何类型,包括对象、数组、日期等。

返回值

返回深拷贝后的新值。如果传入的是基本数据类型,则返回该值本身。

异常处理

  • 如果 valuenullundefined,函数将直接返回该值。
  • 该函数不会抛出异常,但对于无法处理的对象类型(如函数),将会保持原样。

示例代码

深拷贝基本数据类型

javascript
const num = 42;
const clonedNum = deepClone(num);
console.log(clonedNum); // 输出: 42

深拷贝对象

javascript
const obj = { a: 1, b: { c: 2 } };
const clonedObj = deepClone(obj);
console.log(clonedObj); // 输出: { a: 1, b: { c: 2 } }
console.log(clonedObj !== obj); // 输出: true

深拷贝数组

javascript
const arr = [1, 2, { a: 3 }];
const clonedArr = deepClone(arr);
console.log(clonedArr); // 输出: [1, 2, { a: 3 }]
console.log(clonedArr !== arr); // 输出: true

深拷贝含有循环引用的对象

javascript
const circularObj = {};
circularObj.self = circularObj;
const clonedCircularObj = deepClone(circularObj);
console.log(clonedCircularObj); // 输出: { self: [Circular] }

深拷贝日期和正则表达式

javascript
const date = new Date();
const clonedDate = deepClone(date);
console.log(clonedDate); // 输出: 日期对象,时间与原对象相同

const regex = /abc/g;
const clonedRegex = deepClone(regex);
console.log(clonedRegex); // 输出: /abc/g

深拷贝 Map 和 Set

javascript
const map = new Map();
map.set('key1', { a: 1 });
map.set('key2', [1, 2, 3]);

const clonedMap = deepClone(map);
console.log(clonedMap); // 输出: Map { 'key1' => { a: 1 }, 'key2' => [ 1, 2, 3 ] }

const set = new Set([1, 2, { a: 3 }]);
const clonedSet = deepClone(set);
console.log(clonedSet); // 输出: Set { 1, 2, { a: 3 } }

结论

deepClone 函数提供了一种强大的方式来深拷贝复杂数据结构,确保数据的一致性和完整性,尤其在处理嵌套对象、数组和循环引用时极为有效。