实现递归函数的思路:
- 将要拷贝的数据 obj 以参数的形式传参
- 声明一个变量 来储存我们拷贝出来的内容
- 判断 obj 是否是引用类型数据,如果不是,则直接赋值即可( 可以利用 obj instanceof Type 来进行判断),
- 由于用 instanceof 判断array 是否是object的时候,返回值为true, 所以我们在判断的时候,直接判断obj 是否是Array 就可避免这个问题
- 根据判断的不同类型,再给之前的变量赋予不同的类型: [ ] : { }
- 循环obj 中的每一项,如果里面还有复杂数据类型,则直接利用递归再次调用copy函数
- 最后 将 这个变量 return 出来即可
例子:
var obj = {
name:"test",
main:{
a:1,
b:2
},
fn:function(){
},
friends:[1,2,3,[22,33]]
}
function copy(obj){
let newobj = null;
if(typeof(obj) == 'object' && obj !== null){
newobj = obj instanceof Array? [] : {
};
for(var i in obj){
newobj[i] = copy(obj[i])
}
}else{
newobj = obj
}
return newobj;
}
var obj2 = copy(obj)
obj2.name = '修改成功'
obj2.main.a = 100
console.log(obj,obj2)