前几天撸项目代码时, 由一个技术点间接牵扯出了这东西. 所以就来总结一下.

深拷贝
  拷贝对象每个层级的属性.
  作用的对象是 js中引用类型的对象,基本类型没有涉及.
  本质上将引用类型的对象在堆上重新开辟一块新的空间进行存放.

  1. var p_1 = {name: '病猫', age: 22};
  2. var p_3 = {name: p_1.name, age: p_1.age};
  3. p_3.name = "迪迦";
  4. console.log("p_1", p_1); //p_1 {name: "子川", age: 22}
  5. console.log("p_3", p_3); //p_3 {name: "迪迦", age: 22}

浅拷贝
  对于引用类型的对象, 浅拷贝是在栈上重新定义了一个指针,指向的位置却依然是堆中同一对象.  

  1. var p_1 = {name: '病猫', age: 22};
  2. var p_2 = p_1;
  3. p_2.name = "子川";
  4. console.log("p_1", p_1); //p_1 {name: "子川", age: 22}
  5. console.log("p_2", p_2); //p_2 {name: "子川", age: 22}

实现方法

   ①: JSON的序列化与反序列化

  1. let o = JSON.parse(JSON.stringify(obj));
  2. //但是obj中若含有 function, undefined, 正则表达式 时,
  3. //o 中 function, undefined不存在, 正则表达式对应变成了 {};

   ②: 递归   (对日期和正则做了简单处理,)

  1. function deepHandle(obj) {
  2. let tempObj = Array.isArray(obj) ? [] : {};
  3. if (obj && typeof obj === "object") {
  4. for (key in obj) {
  5. if (obj.hasOwnProperty(key)) { //判断自身属性
  6. if (obj[key] && typeof obj[key] === "object") { //是对象类型
  7. let type = Object.prototype.toString.call(obj[key]).slice(8, -1); //具体对象类型
  8. console.log("类型", type);
  9. //Date 与 RegExp 不处理的话, 拷贝之后会成 {},
  10. if (type === 'Date') {
  11. tempObj[key] = new Date(obj[key]);
  12. } else if (type === 'RegExp') {
  13. tempObj[key] = new RegExp(obj[key]);
  14. } else {
  15. tempObj[key] = deepHandle(obj[key]);
  16. }
  17. } else {
  18. tempObj[key] = obj[key];
  19. }
  20. }
  21. }
  22. }
  23. return tempObj;
  24. }
  25. let obj = {
  26. a: '于康',
  27. b: {
  28. age: 21,
  29. city: "山西",
  30. n: [1,2,3, new Date(), /234/igm]
  31. },
  32. c: undefined,
  33. d: null,
  34. e: true,
  35. f: new Date(),
  36. h: {},
  37. i: /234/igm,
  38. toEat: function() {
  39. console.log("吃法")
  40. }
  41. }
  42. let deepObj = deepHandle(obj);
  43. let deepObj2 = JSON.parse(JSON.stringify(obj));
  44. deepObj.i = /123/igm;
  45. console.log("obj", obj);
  46. console.log("deepObj", deepObj);
  47. console.log("deepObj2", deepObj2);

补充一下数据类型
  基本数据类型 (number, string, boolean, null, undefined).
    ①:按值访问,即可操作保存在变量中的实际值.
    ②:值是不可变的,
    ③:名-值存储在栈内存中.
  let name = "病猫"; name = "迪迦"; //看似 name 的值发生了改变, 实际改变的是 指针指向;

  引用数据类型 (即对象类型Object type. 如: Object, Array, Function, Date等)
  let obj = {name: "病猫", age: 22}

    ①: 堆内存中存放引用数据类型的对象 (即 {name: "病猫", age: 22})
    ②: 栈内存中存放引用数据类型的变量名 (即 obj) 和 此对象的 引用地址(即 指针);
    ③: javascript 不允许直接访问与操作堆内存空间, 只能操作对象在栈中的引用地址

结尾

   以上内容是记录自己理解知识后的笔记, 若理解有误, 望您能指出. 感激不尽.      对于这个知识点,网上很多写的通俗易懂的文章(图文), 很Nice的.

JS - 浅拷贝与深拷贝的理解以及简单实现方法的更多相关文章

  1. 关于js浅拷贝与深拷贝的理解

    前端开发中,一般情况下,很少会去在意深拷贝与浅拷贝的关系. 大家知道,js变量有2种数据类型:基本类型和引用类型.基本类型的拷贝是将整个值完全拷贝一份的,也就是深拷贝.就是开辟了新的堆内存.所以基本类 ...

  2. 理解js浅拷贝和深拷贝

    理解深拷贝和浅拷贝之前先了解下js中的基本类型和引用类型 1.基本类型: 在js中,数据的基本类型undefined,null,string,number,boolean,在变量中赋的实际值,基本类型 ...

  3. 关于JS浅拷贝和深拷贝

    在 JS 中有一些基本类型像是Number.String.Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他 ...

  4. Java 浅拷贝和深拷贝的理解和实现方式

    Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...

  5. 【转】Java 浅拷贝和深拷贝的理解和实现方式

    Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...

  6. c#中浅拷贝和深拷贝的理解

    c#中拷贝有浅拷贝和深拷贝之分. 例如对象A,其中有值类型字段和引用类型字段: 1.浅拷贝: 对于值类型字段,直接逐位复制到新拷贝的副本对象中,修改副本的字段的值,不会影响源对象中字段的值: 对于引用 ...

  7. 浅谈Javascript 浅拷贝和深拷贝的理解

    javascript中存储对象都是存地址的. 浅拷贝:浅拷贝是都指向同一块内存区块,浅拷贝共用同一内存地址,你改值我也变.如果拷贝的对象里面的值是一个对象或者数组,它就是浅拷贝,拷贝的知识引用地址.  ...

  8. js 浅拷贝和深拷贝

    传值与传址 了解了基本数据类型与引用类型的区别之后,我们就应该能明白传值与传址的区别了.在我们进行赋值操作的时候,基本数据类型的赋值(=)是在内存中新开辟一段栈内存,然后再把再将值赋值到新的栈中.例如 ...

  9. 前端【JS】,深拷贝与浅拷贝的区别及详解!

    我是前端小白一枚,为了巩固知识和增强记忆,开始整理相关的知识,方便以后复习和面试的时候看看.OK,让我们进入正题~ 先说说浅拷贝和深拷贝的理解吧,个人是这样理解的:两个对象A.B, A有数据B为空,B ...

随机推荐

  1. RESTful API设计方法

    1.如果已经开始逐步的接触到了RESTful API设计方法的朋友,首先要对HTTP/HTTPS有一个大致的了解,虽然本身和RESTful API没有什么关系.但是对于增加网站的安全性还是十分重要的, ...

  2. Scalable Web Architecture and Distributed Systems

    转自:http://aosabook.org/en/distsys.html Scalable Web Architecture and Distributed Systems Kate Matsud ...

  3. XPath语法简明介绍

    简介: XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 路径表达式: XPath 使用路径表达式来选取 XML 文档中的节点 ...

  4. 利用Selenium实现图片文件上传的两种方式介绍

    在实现UI自动化测试过程中,有一类需求是实现图片上传,这种需求根据开发的实现方式,UI的实现方式也会不同. 一.直接利用Selenium实现 这种方式是最简单的一种实现方式,但是依赖于开发的实现. 当 ...

  5. Ajax发送简单请求案例

    所谓简单请求,是指不包含任何参数的请求.这种请求通常用于自动刷新的应用,例如证券交易所的实时信息发送.这种请求通常用于公告性质的响应,公告性质的响应无需客户端的任何请求参数,而是由服务器根据业务数据自 ...

  6. 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针

     1.引用内部函数绑定机制 #include<iostream> #include<functional> usingnamespacestd; usingnamespac ...

  7. 数据可视化利器pyechart和matplotlib比较

    python中用作数据可视化的工具有多种,其中matplotlib最为基础.故在工具选择上,图形美观之外,操作方便即上乘. 本文着重说明常见图表用基础版matplotlib和改良版pyecharts作 ...

  8. h5-news_index

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdcAAABuCAIAAAD6VM6fAAAUEUlEQVR4nO2dfXRTZZ7Hfx735Z/lr9 ...

  9. 在nodejs使用Redis缓存和查询数据及Session持久化(Express)

    在nodejs使用Redis缓存和查询数据及Session持久化(Express) https://segmentfault.com/a/1190000002488971

  10. PHP中出现Notice: Undefined index的三种解决办法

    前一段做的一个PHP程序在服务器运行正常,被别人拿到本机测试的时候总是出现“Notice: Undefined index:”这样的警告,这只是一个因为PHP版本不同而产生的警告(NOTICE或者WA ...