JS中对象的深浅克隆

一、对象的浅克隆
1.浅克隆:只克隆对象的“表层”,如果对象的某些属性值又是引用类型值,则不进一步克隆它们,只是传递它们的引用
2.使用for…in…循环即可实现对象的浅克隆

var obj1 = {a: 1,b: 2,c: [44, 55, 66]
};
// 实现浅克隆
var obj2 = {};for(var k in obj1){// 每遍历一个k属性,就给obj2也添加一个同名的k属性// 值和obj1的k属性值相同obj2[k] = obj1[k];
}// 为什么叫浅克隆呢?比如c属性的值是引用类型值,那么本质上obj1和obj2的c属性是内存中的同一个数组,并没有被克隆分开。
obj1.c.push(77);
console.log(obj2);                  // obj2的c属性这个数组也会被增加77数组
console.log(obj1.c == obj2.c);      // true,true就证明了数组是同一个对象

二、对象的深克隆
1.克隆对象的全貌,不论对象的属性值是否又是引用类型值,都能将它们实现克隆
2.和数组的深克隆类似,对象的深克隆需要使用递归(面试常考)

var obj1 = {a: 1,b: 2,c: [33, 44, {m: 55,n: 66,p: [77, 88]}]
};// 深克隆
function deepClone(o) {// 要判断o是对象还是数组//要注意if语句的判断顺序,因为数组的typeof也是object,即如果先检测typeof o == 'object'//数组和对象都为object ,先检测数组if (Array.isArray(o)) {// 数组var result = [];for (var i = 0; i < o.length; i++) {result.push(deepClone(o[i]));}} else if (typeof o == 'object') {// 对象var result = {};for (var k in o) {result[k] = deepClone(o[k]);}} else {// 基本类型值var result = o;}return result; }
var obj2 = deepClone(obj1);
console.log(obj2); //被克隆console.log(obj1.c == obj2.c);      // false说明被克隆了,内存中不同的对象obj1.c.push(99);
console.log(obj2);                  // obj2不变的,因为没有“藕断丝连”的现象obj1.c[2].p.push(999);
console.log(obj2);                  // obj2不变的,因为没有“藕断丝连”的现象

想了解数组的浅克隆和深克隆点击即可

JS:对象的浅克隆、深克隆相关推荐

  1. js对象深拷贝(深克隆)

    我们首先看下面的例子: var userInfo = {username:"zhangsan",age:20}var copyUserInfo = userInfo;userInf ...

  2. js 对象的clone()函数

    function clone(Obj){var buf;if(Obj instanceof Array){buf=[];var i=Obj.length;while(i--){buf[i]=clone ...

  3. JS 对象封装的常用方式

    JS是一门面向对象语言,其对象是用prototype属性来模拟的,下面,来看看如何封装JS对象. 常规封装 function Person (name,age,sex){ this.name = na ...

  4. js对象,原型,call,apply浅析

    //对象直接量,创建对象最简单的方式是在js里使用对象直接量var book = {"main title": "js", //属性里有空格,要用引号" ...

  5. JS对象和JSON字符串相互转化总结

    在web开发中,一般情况下需要前端和服务器的交换数据,我们一般使用JSON来完成数据的传输,JavaScript操作的对象是一般是变量:因此我们需要将JSON字符串转换为JS变量,下面总结JS对象和J ...

  6. JS 对象机制深剖——new 运算符

    其实关于 new 的讨论,早有众多前辈做了先行.然而作为 JS 对象机制系列的一个重要成员,这一篇不可少,而且按照自己的惯例,我将首先引用语言规范的内容.另外,本篇引用到的规范内容比较多,不过我会做详 ...

  7. 在js对象上绑定js数组原生方法

    在js对象上绑定js数组原生方法 在js对象上绑定数组方法会给当前对象添加一个lenght:0属性 例: var o = {}; [].pop.call(o) console.log(o)//返回结果 ...

  8. JQuery对象和JS对象区别与转换|| 事件绑定 入口函数 样式控制

    JQuery对象和JS对象区别与转换   1. JQuery对象在操作时,更加方便.     2. JQuery对象和js对象方法不通用的.     3. 两者相互转换         * jq -- ...

  9. 从JS对象开始,谈一谈“不可变数据”和函数式编程

    文章转载自:https://segmentfault.com/a/1190000008780076 作为前端开发者,你会感受到JS中对象(Object)这个概念的强大.我们说"JS中一切皆对 ...

最新文章

  1. 利用NVIDIA-NGC中的MATLAB容器加速语义分割
  2. linux下将多个文件去除文件头合并_shell命令实现当前目录下多个文件合并为一个文件的方法...
  3. 江苏省三级偏硬试题样卷
  4. linux 时钟同步 chrony 简介
  5. js 取值 getElementsByTagName,getElementsByName
  6. Linux -sed
  7. [mybatis]Configuration XML_typeHandlers
  8. input发送a.jax_与时俱进:在JAX-RS API中采用OpenAPI v3.0.0
  9. 玩转大数据系列之三:数据报表与展示
  10. mysql 实例与用户_MySQL(17):用户登录实例
  11. iphone模拟器_应用日报 | Xcode 现身 5.4 英寸 iPhone 模拟器,和平精英上线特斯拉皮肤...
  12. 巴比特观察 | NFT朋克热潮:CryptoPunks的成功可以复制吗
  13. 电池电量显示模块、美容仪、剃须刀、血氧仪、红外体温计、脱毛器、(耳)额温枪、电子秤等段码屏LCD液晶显示驱动IC-VK1024B 6*4段显示,VK1056 14*4段显示,少脚位1621,具省电模式
  14. 【互联网大厂研究】让千千万万底层人民脱贫致富的【快手】,他有何等魔力?
  15. 【pingce360】传小米平板MIPAD采用MTK8125四核 或售999元
  16. Why do we insist? 打卡
  17. 发散思维能力(1-2)
  18. 【CSS 遮挡和剪切属性 Masking】
  19. java从小白到架构师学习路线
  20. 【无标题】手机电脑被木马病毒感染,私生活被全面监控

热门文章

  1. Packet Tracer - 配置 EtherChannel
  2. CentOS8下Mosquitto安装使用指南
  3. Java封装FushionCharts
  4. 多线程比串行进程多出的优势在哪里
  5. 恢复W ndows10系统方法步骤,教你windows10的映像文件还原系统
  6. Java中过大整数储存问题(bushi
  7. 数据结构——图的邻接表存储
  8. 有容乃大:楚庄王(第二篇
  9. HTML元素脱离文档流的三种方法
  10. 原生js-简易点名册实现