首先,从copy开始说,简而言之,copy的目的就是生成一个新的实例,然后把其成员都按原实例赋值。对于非指针型的成员,比如boolern、String、Number等,这样的赋值可以直接进行。但是对于指针型的数据,比如Object,就有深拷贝和浅拷贝的区别。我们接下来通过示例来进行介绍:

浅拷贝

// demo1.js
var obj = {name: 'bill',sex: '1',getName: function() {return this.name;},config: {birstary: '1992-02-02',isTrue: true}
}function copy(obj) {var o = {}for (let i in obj) {o[i] = obj[i]    }return o;
}
var obj2 = copy(obj);
obj2.name = 'bill2'
obj2.config.isTrue = false
console.log(obj2)
console.log(obj)
复制代码

通过demo1.js我们可以了解到,我们修改了obj2的属性name,以及obj2中config对象内的属性isTrue。打印查看结果后发现,obj的config对象内的属性isTrue也跟着变了。这是因为config是一个对象,我们在copy的时候只是将config对象的指针进行了拷贝,而原对象并没有进行拷贝。所以,如果我们想修改obj2的config对象内的属性而不影响obj的话我们就需要深拷贝,具体实现如下:

var obj = {name: 'bill',sex: '1',getName: function() {return this.name;},config: {birstary: '1992-02-02',isTrue: true}
}function copy(obj) {var o = {}for (let i in obj) {if (obj[i].toString() == '[object Object]') {var obj2 = copy(obj[i])o[i] = obj2;} else {o[i] = obj[i]}}return o;
}
var obj2 = copy(obj);
obj2.name = 'bill2'
obj2.config.isTrue = false
console.log(obj2)
console.log(obj)
复制代码

我们运用递归的方法,检测是否是Obejct。如果不是直接赋值,如果是,我们再对Object进行拷贝。

【JS第1期】深拷贝实现原理相关推荐

  1. python深拷贝实现原理,js递归实现深拷贝

    经过小编之前关于JavaScript深拷贝实现方式的介绍,大家已经知道深拷贝能够实现真正意义上的数组和对象的拷贝.其实使用内置对象JSON虽然简答,但不能将对对象的方法深拷贝,因此使用递归的方式就是最 ...

  2. php new对象 调用函数,关于JS中new调用函数的原理介绍

    这篇文章主要介绍了关于JS中new调用函数的原理介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 JavaScript 中经常使用构造函数创建对象(通过 new 操作符调用一个函数) ...

  3. ZooKeeper学习第七期--ZooKeeper一致性原理

    ZooKeeper学习第六期---ZooKeeper机制架构 ZooKeeper学习第一期---Zookeeper简单介绍 ZooKeeper学习第二期--ZooKeeper安装配置 ZooKeepe ...

  4. JS原型链与instanceof底层原理

    转载自  JS原型链与instanceof底层原理 一.问题: instanceof 可以判断一个引用是否属于某构造函数: 另外,还可以在继承关系中用来判断一个实例是否属于它的父类型. 老师说:ins ...

  5. [js] fetch和axios请求的原理都是基于XMLHttpRerequst吗?

    [js] fetch和axios请求的原理都是基于XMLHttpRerequst吗? axios是基于XMLHttpRequest的封装,而fetch是js原生支持的网络请求api,这在浏览器底层进行 ...

  6. js中的浅拷贝深拷贝深入理解

    举个例子来说明一下什么是浅拷贝什么是深拷贝 浅拷贝 var x = {a: 1,b: {f: {g: 1}},c: [1, 2, 3] }; var y = shallow(x); 得出的结果可以看出 ...

  7. js事件委托(事件代理)的原理以及优缺点

    js事件委托/事件代理的原理以及优缺点 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上 ...

  8. 图形化开发(一)——D3.js的基本介绍、技术原理

    图形化开发(一)--D3.js的基本介绍.技术原理 D3.js 为什么学习D3 中文官网--https://www.d3js.org.cn/ github--https://github.com/d3 ...

  9. js计算生理期代码怎么写

    js计算生理期代码怎么写,js实现生理期计算方法教程如下: 1.输入上次月经日期 2.输入平均月经周期 计算结果:计算出对应排卵期.安全期和月经期 js实现代码: function Calculate ...

最新文章

  1. php定时爬虫,thinkphp5使用workerman定时器定时爬取站点内容的代码
  2. 观咆哮有感——系统升级的疼
  3. numpy.random.uniform()
  4. Oracle 11g系统自动收集统计信息
  5. leetcode 208 python3
  6. P3930 SAC E#1 - 一道大水题 Knight
  7. Oracle数据库中NOLOGGING和FORCE LOGGING
  8. 百度文档免费下载+PDF转word
  9. Python爬虫,超简单地实现一键提取阴阳师原画
  10. Windows NT引导过程源代码分析(一)
  11. 【C/C++基础进阶系列】实战记录 -- Dump 文件生成与分析
  12. 砍价两种种算法(转载)
  13. 三位数求最大公因数c语言,求最大公因数的三种算法
  14. 神犇营-my1002-朋友圈集赞
  15. VMware创建虚拟机时出现 network bot from intel e1000
  16. C#工业触摸屏上位机源码 替代传统plc搭载的触摸屏
  17. 计算构成三角形的个数
  18. 基于web的学生管理系统(一)简介
  19. Dell XPS15 4K GTX1050 ubuntu16.04系统安装+分辨率设置
  20. 山东大学软件学院2019软件测试考试回忆

热门文章

  1. 递推+矩阵快速幂 HDU 2065
  2. “见识”很重要 记一起Oracle的SQL调整
  3. dp、px之间单位转换Util
  4. Servlet 表单数据笔记
  5. directx最终用户运行时_WSL将支持GPU计算,并可运行Linux GUI应用
  6. activate tensorflow_“量子固件”来了!利用 TensorFlow 提升量子计算硬件性能
  7. 从敲下一行JS代码到这行代码被执行,中间发生了什么?
  8. ES6系列:什么是ES6? 新手应该怎么理解
  9. 现在加入Web前端学习还有市场吗?自己是否适合学习前端
  10. json在java中的使用_在Java中使用JSON