js的浅拷贝与深拷贝
浅拷贝
- Object.assign()
1
2let obj = {}
Object.assign({},obj) - 展开运算符
1
2let obj = {}
const obj2 = {...obj}
深拷贝
- JSON.parse(JSON.stringify(obj))此方式仅适用于对象,数组,不适合函数、Date等类型,如果是循环的引用,会造成死循环
1
2let obj = {}
const obj2 = JSON.parse(JSON.stringify(obj)) - 递归
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
28const deepClone = (obj, map = new WeakMap()) => {
//判断传进来的list是否为引用类型数据
if (typeof obj === 'object') {
//通过list的constructor来指定cloneList的类型
const cloneObj = new obj.constructor
//如果是Date,RegExp类型直接返回
if (obj instanceof Date) return new Date(obj)
if (obj instanceof RegExp) return new RegExp(obj)
//如果传进来的list已经存在于map中直接返回对应的value
if (map.has(obj)) {
return map.get(obj)
}
//保存每个list key
map.set(obj, cloneObj)
for (const key in obj) {
//不循环原型上的key
if (Object.hasOwnProperty.call(obj, key)) {
//每个key值等于deepClone的函数返回值,把新的map作为参数传递
cloneObj[key] = deepClone(obj[key], map)
}
}
return cloneObj
} else {
//值类型直接返回
return obj
}
}
js的浅拷贝与深拷贝
https://yifengtingyu.cn/2024/04/23/js的浅拷贝与深拷贝/