说明:此文章仅供学习与参考,如需转载请注明出处
1.浅克隆:如果包含内嵌的对象或者数组,则不再复制副本
深克隆:如果包含内嵌的对象或者数组,也复制副本
2.实现过程见代码:
/**
浅克隆:如果包含内嵌的对象或者数组,则不再复制副本
深克隆:如果包含内嵌的对象或者数组,也复制副本
*/
var stu = {
name: "zhangsan",
stuId: 1,
gender: "male",
age: 18,
score: null,
sc:["语文","英语","数学"],
course: {
"语文":85,
"数学": 100,
"英语": 90
}
}
//浅克隆:如果包含内嵌的对象或者数组,则不再复制副本.即如果其中包含对象或者数组时,
//则此时复制的是该对象或者数组的引用,因此,当修改克隆对象中的属性值时,原对象中的内容也会
//同时被改变,因此如果对象中包含数组或者内嵌对象,使用浅克隆不行。因此需要使用深克隆。
function lightClone(obj) {
var newObj = {};
for (var item in obj) {
newObj[item] = obj[item]
}
return newObj;
}
//深克隆:如果包含内嵌的对象或者数组,则不再复制副本
function deepClone(obj) {
var newObj = {};
// 判断克隆的对象中是否存在null属性
if(obj === null) {
return null;
} else if({}.toString.call(obj) === "[object Array]") {
//判断克隆对象中是否存在数组,如果有数组则创建一个数组,重新赋值,否则
//克隆后的数字会被默认克隆为一个类数组
var newArr = [];
newArr = obj.slice(); //截取整个数组的内容
return newArr;
}
// 遍历stu的每个属性
for (var key in obj) {
// 如果原对象中当前属性值为原始类型,直接复制副本中的内容
if (typeof obj[key] !== "object"){
newObj[key] = obj[key];
}else{ //否则,如果是引用类型,再次调用克隆函数,继续复制当前属性值
newObj[key] = deepClone(obj[key]);
}
}
return newObj;
}
var lightObj = lightClone(stu);
console.log(lightObj);
// lightObj.course["数学"] = 150;
var deepObj = deepClone(stu);
console.log(deepObj);
3.深克隆实现过程说明:
3.1创建新对象
3.2遍历obj对象的每个属性
3.2.1如果obj为原始类型,则直接复制内容
3.2.3如果为引用类型,再次调用克隆函数,继续复制
3.2.3.1如果继续克隆的对象为null,则返回null
3.2.3.2如果继续克隆的对象为数组,则新建一个数组,复制数组中的内容
4.实现过程: