浅克隆:只克隆第一级属性,如果某个属性又是一个内嵌的子对象,不会进入子对象中克隆子对象的内容,而是将指向的地址赋给属性。
var stu = {
name : "xingxing",
aclass: "五年级六班",
age:12,
sex : "男",
address:{
province : "河南省",
city:"郑州市",
area:"金水区"
}
}
function clone(student){
if(student == null){
return null;
}
var stu1 = Array.isArray(student)?[]:{};
//1、利用for循环遍历进行赋值
// for(var key in stu){
// stu1[key] = stu[key];
// }
//2、打散对象,复制对象
var stu1 = {...stu};
return stu1;
}
var stu1 = clone(stu);
console.log(stu1 == stu);//false
console.log(stu1.address == stu.address);//true
深克隆:既可以克隆第一级属性,如果某个属性又是一个内嵌的子对象,深克隆会进入子对象中,继续克隆内嵌子对象及其内容。核心思想是递归,当发现对象内部某个属性仍然是对象是,会继续调用克隆函数继续进行赋值。
var stu = {
name : "lilie",
aclass: "五年级六班",
age:12,
sex : "男",
address:{
province : "河南省",
city:"郑州市",
area:"金水区"
}
}
function deepclone(stu){
if(stu == null){
return null;
}
// 数组是特殊的对象类型
if(typeof stu!== "object"){
return stu;
}
var newstu = Array.isArray(stu)?[]:{};
for(var key in stu){
newstu[key] = deepclone(stu[key]);
}
return newstu;
}
var stu1 = deepclone(stu);
console.log(stu1);
console.log(stu1 == stu);//false
console.log(stu1.address == stu.address);//false
第二种,利用JSON来实现
function deepClone(oldObj){
let newObj = JSON.stringify(oldObj);
return JSON.parse(newObj);
}
第三种
function deepClone(oldObj){
if(oldObj === null){
return null;
}else if({}.toString.call(oldObj) === '[object Array]'){
var newArr = [];
newArr = oldObj.slice();
return newArr;
}else if(typeof oldObj !== "object"){
return oldObj
}
var newArr = null;
for(let key in oldObj){
if(typeof oldObj[key] !== "object"){
newArr[key] = oldObj[key]
}else{
newArr[key] = deepClone(oldObj[key])
}
}
return newArr;
}