在实际项目中,经常使用到深拷贝,索性封装成一个函数
function deepCopy(obj) {
// 1、为了兼容数组和对象,所以写一个兼容性赋值
let newObj = Array.isArray(obj) ? [] : {}
// 2、接下来进行循环传进来的对象 (for...in...也会循环原型链上的内容)
for(let key in obj) {
// 3、因为for...in会循环原型链上的内容,而我们深拷贝的新对象无需原型链上的内容,因此加一层原型链判断
if(obj.hasOwnProperty(key)) { // 判断是非原型上的数据
// 4、接着判断是复杂数据类型,还是基本数据类型,如果是基本数据类型,直接赋值就行
if(typeof(obj[key]) !== 'object') {
// 基本数据类型
newObj[key] = obj[key]
} else {
// 复杂数据类型,递归再次进行判断
newObj[key] = deepCopy(obj[key])
}
}
}
return newObj
}
// 接着验证上面函数
let obj = {
name: 'lis',
fn: () => {
console.log(1)
},
child: {
age: 1,
son: []
}
}
let newObj = deepCopy(obj)
console.log(newObj)
拿走了
Keep on working, great job!