手写递归深拷贝,必会的
<script>
// 定义一个嵌套深的对象,深拷贝
let obj = {
name: '张三',
list: [1, 2, 3]
}
//判断是否是基本数据类型,如果是直接return,因为复杂数据类型才会深拷贝
function deepClone(obj) {
//判断是否是基本数据类型,nul也是基本数据类型
if (typeof obj !== 'object' || obj == null) {
return obj
}
//初始化判断是数组还是对象 初始化返回结果
let result
if (obj instanceof Array) {
result = []
} else {
result = {}
}
//for in 循环,数组和对象有原型,空的也有,没必要去拿obj原型上的方法或属性
for (let key in obj) {
//排除原型上的方法或属性 hasOwnProperty判断是否是自己私有属性
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key]) //递归调用
}
}
return result
}
console.log(obj); //{name: '张三', list: Array(3)}
let newObj = deepClone(obj)
console.log(newObj); //{name: '张三', list: Array(3)}
// 检测一下深拷贝是否成
newObj.name = '李四'
console.log(newObj); //{name: '李四', list: Array(3)} ok 关机下班
</script>