JS 深拷贝
手写js深拷贝
1、序列化,缺点:会忽略undefined,NaN
JSON.parse(JSON.stringify(arr))
2、递归
function isTypeof(data) {
return Object.prototype.toString.call(data).slice(8, -1)
}
function deepCopy(data) {
let type = isTypeof(data)
let obj
if (type === 'Array') {
obj = []
for (let i = 0; i < data.length; i++) {
obj.push(deepCopy(data[i]))
}
} else if (type === 'Object') {
obj = {}
for (let keys in data) { // 默认会遍历原型上的属性
// hasOwnProperty 判断对象上是否存在该属性
if (data.hasOwnProperty(keys)) {
obj[keys] = deepCopy(data[keys])
}
}
} else {
return data
}
return obj
}
3、通过展开运算符(一层深拷贝)
const arr = [...arr]
const obj = {...obj}
4、通过Object.assign()复制对象(一层深拷贝)
总结:方法很多,如各种遍历等,我认为核心在于,在堆中创建一个新的空间(空对象),再通过一些手段将数据添加进去,即可实现深拷贝。