博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅拷贝深拷贝
阅读量:5964 次
发布时间:2019-06-19

本文共 1899 字,大约阅读时间需要 6 分钟。

浅拷贝深拷贝

  • 基本数据类型在内存单元中保存的是具体值。

  • 复杂数据类型在内存单元中保存的是具体的指针

什么是浅拷贝

创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

1

var obj1 = { a: 10, b: 20, c: 30 };     var obj2 = Object.assign({}, obj1);     obj2.b = 100;     console.log(obj1);     // { a: 10, b: 20, c: 30 } <-- 沒被改到     console.log(obj2);     // { a: 10, b: 100, c: 30 }

2 Object.assign()

Object.assign是ES6的新函数。Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

Object.assign(target, ...sources)

var obj1 = { a: 10, b: 20, c: 30 };    var obj2 = Object.assign({}, obj1);    obj2.b = 100;    console.log(obj1);    // { a: 10, b: 20, c: 30 } <-- 沒被改到    console.log(obj2);    // { a: 10, b: 100, c: 30 }
  • 深拷贝

1 对象只有一层的话可以使用上面的:Object.assign()函数

2 转成 JSON 再转回来

var obj1 = { body: { a: 10 } };    var obj2 = JSON.parse(JSON.stringify(obj1));    obj2.body.a = 20;    console.log(obj1);    // { body: { a: 10 } } <-- 沒被改到    console.log(obj2);    // { body: { a: 20 } }    console.log(obj1 === obj2);    // false    console.log(obj1.body === obj2.body);// false

3 递归拷贝

var obj = {      name: "jack",      messages: {        age: 18,        gender: 'men'      },      arr: [10, 20]    }    function deepCopy(currentObj, targetObj) {      // 基本数据类型      for(var k in currentObj) {        if(typeof currentObj[k]!="object" || currentObj[k]=== null) {          targetObj[k] = currentObj[k]        } else { // 复杂数据类型          // 复杂数据类型值有可能是对象,也有可能是数组,需要进行判断后再设置          targetObj[k] = currentObj[k] instanceof Array ? [] : {}          deepCopy(currentObj[k], targetObj[k])        }      }    }    var obj2 = {}    deepCopy(obj, obj2)    obj.name = 'rose'    obj2.messages.age=100    console.log(obj)    console.log(obj2)

1353044-20181231213758142-1775882306.jpg

转载于:https://www.cnblogs.com/zhtian/p/10203348.html

你可能感兴趣的文章
linux添加环境变量
查看>>
Dumpsys Input Diagnostics
查看>>
ASP.NET MVC 入门8、ModelState与数据验证
查看>>
被swoole坑哭的PHP程序员
查看>>
linux进程调度之 FIFO 和 RR 调度策略---SYSTEMTAP
查看>>
JSTL的相关使用
查看>>
ActiveMQ, RabbitMQ和ZeroMQ 选型关注点
查看>>
王垠:完全用Linux工作
查看>>
Understanding the Router
查看>>
红米3 Flyme5.1.9.5插桩适配长期不定时更新
查看>>
MySQL 5.6 for Windows 解压缩版配置安装(转)
查看>>
组件居中显示 安卓
查看>>
delete
查看>>
sql server生成不重复的时间字符串
查看>>
DataBase 之 数据库设计六大范式
查看>>
Struts与Struts2的区别
查看>>
Zookeeper集群搭建
查看>>
EasyUI 搜索框
查看>>
If you insist running as root, then set the environment variable RUN_AS_USER=root...
查看>>
Atitit.ide技术原理与实践attilax总结
查看>>