简介

一.为什么需要深拷贝

js中数据类型分基本数据类型和引用数据类型,基本数据类型存放在栈内存,引用数据类型存放在堆内存,在栈内存中只存放一个指针,指向堆内存中的引用。浅拷贝只是拷贝了指针,修改数据会影响源数据。如果不想改变源数据就需要深拷贝。

二.深拷贝方法

1.JSON.parse, JSON.stringify

这种方法无法拷贝值为undefined、function、regexp类型的属性

1
let obj2 = JSON.parse(JSON.stringify(obj1))
2.Object.assign()

这种方法只能对只有一个层级的对象(所有属性的值都是基础数据类型)深拷贝

1
Object.assign({}, obj1, obj2, obj3)
3.递归
1
2
3
4
5
6
7
8
9
10
11
12
function deepClone(obj) {
if(obj === null) return obj
if(typeof obj != 'object') return obj

let result = obj instanceof Array ? [] : {}

for(let key in obj) {
if(obj.hasOwnProperty(key)) result[key] = dp(obj[key])
}

return result
}