一、概念理解
在 JavaScript 的浅拷贝中,如果一个数据是简单类型,直接复制它的值,如果一个数据是复杂数据类型,复制的是它地址的引用,有时候需要我们去深拷贝一个东西。
二、JSON.stringify()
这是最简单的深拷贝,特点是简单,但它有一个限制,它只能拷贝符合 JSON 语法的数据类型,数组、对象等,Date 类型它就无法拷贝。
let obj1 = {a:'1',b:'2'}
let obj2 = JSON.parse(JSON.stringify(obj1))
二、递归算法
要点是
- 递归
- 判断类型
- 检查循环引用
- 需要忽略原型
function deepClone(target){
if (typeof target ==='object'){
let cloneTarget = Array.isArray(target) ?[]:{}
for (let key in target){
cloneTarget[key] = deepClone(target[key])
}
return cloneTarget
}else{
return target
}
}
const target = {
field1: 1,
field2: undefined,
field3: {
child: 'child'
},
field4: [2, 4, 8]
};
const cloneTarget = deepClone(target)
console.dir(target)
console.dir(cloneTarget)
三、参看博客
「@浪里淘沙的小法师」