//obj可以为数组对象函数原始类型,deep为true时候开启深度克隆。
var clone = function(obj,deep){
if(Array.isArray(obj)){
if(deep){
var newArr = [];
for(var i= 0;i < obj.length; i++){
newArr.push(this.clone(obj[i],deep));
}
return newArr;
}else{
return obj.slice();//复制数组
}
}
else if(typeof obj === "object"){
var newObj = {};
for(var prop in obj){
if(deep){
//deep为true开启深度克隆
newObj[prop] = this.clone(obj[prop],deep);//递归
}else{
newObj[prop] = obj[prop];
}
}
return newObj;
}
else{
//函数、原始类型
return obj;
}
}
var obj = {
a:1,
b:2,
sonobj:{
c:3,
d:4,
}
}
//看看深度克隆的作用
var objclone1 = clone(obj);
console.log(objclone1.sonobj === obj.sonobj); //true,浅克隆,地址不一样
var objclone2 = clone(obj,true);
console.log(objclone2.sonobj === obj.sonobj);//false,深度克隆,递归子对象也创建了新对象,地址不一样
var array1 = [1,2,[3,4]];
var arrayclone1 = clone(array1,true);
var arrayclone2 = clone(array1);
console.log(arrayclone1);//[1, 2, Array(2)]
console.log(arrayclone2);//[1, 2, Array(2)]
console.log(arrayclone1[2] === array1[2])//flase
console.log(arrayclone2[2] === array1[2])//true
用js写一个克隆对象的封装函数
最新推荐文章于 2021-11-05 21:25:47 发布