遍历对象 for(const prop in obj) for in 也可遍历数组,那么它的arr[prop]就是他的索引 1.判断是不是原始值 typeof obj--》引用值 2.判断是数组还是对象 (1)instance of --》a的原型链上是否有b的原型 (2)toString--》推荐使用 (3)constructor 3.建立相应的数组 对象 递归
function deepClone(origin,target){
let target = target || {} //有的话就用自己的,没有就用空对象
toStr = Object.prototype.toString
arrStr = "[object Array]" //用来做比对
for (const prop in origin){
//for in 之前,加一层判断,判断是否是原型上的属性,是true再继续往下走hasOwnProperty避免拿它原型链上的属性。
if(orgin.hasOwnProperty(prop)){
//1.判断是否是原始值
if(origin[prop]!=null && typeof(origin[prop]=='object')){
//引用值
//2.判断是数组还是对象
if(toStr.call(origin[prop])==arrStr){
target[prop] = []
}else {
target[prop] = {}
}
deepClone(origin[prop],target[prop]) //递归
}else{
//原始值--》直接复制
target[prop] = origin[prop]
}
}
}
//如果没传target 就要把target return出去
return target
}
深拷贝 对原始值没有影响