deepClone (深拷贝)
deepClone
函数用于深拷贝一个值,包括基本数据类型、对象、数组、日期、正则表达式、Map 和 Set 等。此函数能够处理循环引用的情况,确保每个对象只被拷贝一次。
函数调用方式
javascript
deepClone(value)
参数说明
参数名 | 类型 | 描述 |
---|---|---|
value | Any | 要进行深拷贝的值,可以是任何类型,包括对象、数组、日期等。 |
返回值
返回深拷贝后的新值。如果传入的是基本数据类型,则返回该值本身。
异常处理
- 如果
value
为null
或undefined
,函数将直接返回该值。 - 该函数不会抛出异常,但对于无法处理的对象类型(如函数),将会保持原样。
示例代码
深拷贝基本数据类型
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
函数提供了一种强大的方式来深拷贝复杂数据结构,确保数据的一致性和完整性,尤其在处理嵌套对象、数组和循环引用时极为有效。