说下思路直接上代码:
1 判断对象是数组还是对象,给rightObject初始值
2 for in 循环rawObject
3 用hasOwnProperty来排除原型链上的属性
4 判断取的值是对象还是普通数据类型
5 是对象就循环调用deppClone函数,普通值就直接赋值就好了
6 最后就直接返回操作完的对象就可以了
代码如下:
let obj1 = {
a:1,
b:2,
c:{
d:4
}
}
function deepClone(rawObject){
let rightObject = rawObject.constructor === Array ? [] : {}
for(let key in rawObject){
// hasOwnProperty()方法用于检测一个对象是否含有特定的自身属性 -- 原型上的方法会被for in循环处理 -- 所以使用hasOwnProperty来排除原型链上的其他属性
if(rawObject.hasOwnProperty(key)){
if(typeof rawObject[key] === 'object'){
rightObject[key] = deepClone(rawObject[key])
} else {
rightObject[key] = rawObject[key]
}
}
}
return rightObject
}
const obj2 = deepClone(obj1)
obj2.c.d = 5
console.log(obj1,obj2);