概念
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象共享同一块内存。而深拷贝会另外创建一个一模一样的新对象,新对象跟原对象不共享内存,修改新对象不会更改原对象。
JSON.parse()、JSON.stringify()
这种方法存在一个问题:能正确处理的对象只有 Number、String、Array 等能够被 JSON 表示的数据结构,因此像函数、undefined、正则表达式、引用这种不能被 JSON 表示的类型将不能被正确处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| let obj = { name: 'LqZww', age: 18, like: { game: 'TLBB', ear: 'rou' }, arr: [1, 2] };
let deepClone = JSON.parse(JSON.stringify(obj)); deepClone.name = 'lq'; deepClone.like.game = 'LOL'; console.log(obj); console.log(deepClone); console.log(obj === deepClone);
|
for…in + 递归
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
| let obj = { name: 'LqZww', age: 18, like: { game: 'TLBB', ear: 'rou' }, arr: [1, 2] };
function deepClone(object) { let object2 if (!(object instanceof Object)) { return object } else if (object instanceof Array) { object2 = [] } else if (object instanceof Function) { object2 = eval(object.toString()) } else if (object instanceof Object) { object2 = {} } for (let key in object) { object2[key] = deepClone(object[key]) } return object2 }
var obj2 = deepClone(obj) obj2.name = 'lq'; obj2.like.game = 'LOL'; console.log(obj) console.log(obj2) console.log(obj === obj2)
|
Github - 详细代码