1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| 深拷贝是指将一个对象完整地复制到另一个对象,包括对象的所有属性和嵌套对象,而不是复制对象的引用。 实现深拷贝需要遍历对象的所有属性,并递归地复制每个属性的值。 下面是两种常见的实现深拷贝的方法:
1-递归方法:
递归方法是一种常见的实现深拷贝的方式,它遍历对象的所有属性,并递归地复制每个属性的值。 需要判断属性值的类型,如果是对象类型,则递归调用深拷贝函数复制对象的属性; 如果是基本数据类型,则直接复制属性的值。 需要注意处理循环引用的情况,可以使用一个 Map 数据结构保存已经拷贝过的对象, 遇到循环引用时直接返回已拷贝过的对象。 示例代码:
function deepCopy(obj, hash = new WeakMap()) { if (obj === null || typeof obj !== 'object') return obj; // 如果已经拷贝过该对象,则直接返回拷贝后的对象 if (hash.has(obj)) return hash.get(obj); let copy = Array.isArray(obj) ? [] : {}; // 将新创建的对象添加到哈希表中 hash.set(obj, copy); for (let key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { // 递归拷贝对象的每个属性 copy[key] = deepCopy(obj[key], hash); } } return copy; }
const obj1 = { a: 1, b: { c: 2 } }; const obj2 = deepCopy(obj1); console.log(obj2); // { a: 1, b: { c: 2 } }
2-JSON 方法:
JSON 方法是一种简单的实现深拷贝的方式,可以利用JSON.stringify 和JSON.parse方法实现深拷贝。 首先将对象转换为 JSON 字符串,然后再将 JSON 字符串解析为新的对象,从而实现深拷贝。 这种方法的缺点是,它无法处理函数、正则表达式、Symbol 等特殊类型的属性,会丢失对象的原型链。 示例代码:
const obj1 = { a: 1, b: { c: 2 } }; const obj2 = JSON.parse(JSON.stringify(obj1)); console.log(obj2); // { a: 1, b: { c: 2 } }
这两种方法都可以实现深拷贝,可以根据具体情况选择使用哪一种方法。 递归方法更加灵活和通用,适用于复杂的对象结构;而 JSON 方法更加简洁和直观,适用于普通的对象。
|