浅克隆与深克隆

编程入门 行业动态 更新时间:2024-10-22 10:39:34

浅克隆与深克隆

浅克隆与深克隆

说明:此文章仅供学习与参考,如需转载请注明出处
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.实现过程:



更多推荐

浅克隆与深克隆

本文发布于:2024-02-27 05:49:48,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1705414.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!