一:什么是深拷贝?

举例:a=b,正常情况下当改变a时b也改变,当改变a时b第一层不改变copy就是浅拷贝,当改变a时b底基层都不会改变就是深拷贝

二:实现深拷贝

1、最简单方法就是使用JSON.stringfy()和JSON.parse()。

var syb = Symbol('obj');
var person = {name :'tino',say: function(){console.log('hi');},ok: syb,un: undefined
}
var copyPerson = JSON.parse(JSON.stringify(person))

但是有局限性:当值为undefinedfunctionsymbol 会在转换过程中被忽略,对象值有这三种的话用这种方法会导致属性丢失。

2、通用方法(递归复制)

deepClone => (obj){let objClone = Array.isArray(obj)?[]:{};if(obj && typeof obj==="object"){for(key in obj){if(obj.hasOwnProperty(key)){//判断ojb子元素是否为对象,如果是,递归复制if(obj[key]&&typeof obj[key] ==="object"){objClone[key] = deepClone(obj[key]);}else{//如果不是,简单复制objClone[key] = obj[key];}}}}return objClone;
}

另外注意obj.hasOwnProperty(key)有什么用?

使用了for in遍历数组,就需要用hasOwnProperty来规避遍历到原型链上的属性或方法

转载于:https://www.cnblogs.com/piaobodewu/p/10393863.html

js的深拷贝的理解和实现相关推荐

  1. 一篇文章彻底说清JS的深拷贝/浅拷贝

    一篇文章彻底说清JS的深拷贝and浅拷贝 这篇文章的受众 第一类,业务需要,急需知道如何深拷贝JS对象的开发者. 第二类,希望扎实JS基础,将来好去面试官前秀操作的好学者. 写给第一类读者 你只需要一 ...

  2. js回调函数的理解(轉)

    js回调函数(callback)理解Mark!讲之前说一句function say(){alert(,,,,,,,,)}var say=function (){alert(,,,,,,,)}var s ...

  3. javascript中浅拷贝和深拷贝的理解

    javascript中浅拷贝和深拷贝的理解 什么是拷贝? 简单地说就是复制,对数据的复制 浅拷贝:改变拷贝者的值,被拷贝者的值也会变化 深拷贝:改变拷贝者的值,被拷贝者的值不会变化 由于基本数据类型是 ...

  4. Js模块化开发的理解

    Js模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...

  5. Python中浅拷贝和深拷贝的理解与研究

    Python中浅拷贝和深拷贝的理解与研究 单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) ...

  6. 理解Babel是如何编译JS代码的及理解抽象语法树(AST)

    Babel是如何编译JS代码的及理解抽象语法树(AST) 1. Babel的作用是?    很多浏览器目前还不支持ES6的代码,但是我们可以通过Babel将ES6的代码转译成ES5代码,让所有的浏览器 ...

  7. JS中setter/getter理解

    JS中setter/getter理解 JS对象属性 get/set和getter/setter 数据属性 Object.defineProperty() 访问器属性 getter/setter创建及删 ...

  8. JS实现深拷贝常用的几种方法

    JS实现深拷贝常用的几种方法 <!DOCTYPE html> <html lang="en"> <head><meta charset=& ...

  9. Js面向对象的程序设计——理解对象

    Js面向对象的程序设计 Js面向对象的程序设计 理解对象 属性类型 Js面向对象的程序设计 理解对象 示例 : var person=new Object(); person.name="N ...

  10. Python中浅拷贝和深拷贝的理解与研究 1

    Python中浅拷贝和深拷贝的理解与研究 单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) ...

最新文章

  1. [亿能测试_www.gdtesting.com]测试技术资料网盘共享
  2. 如何给按钮加上链接功能
  3. 智·御未来 亚信安全巡展·2017即将起航
  4. 我写了14篇文章,总结了《具体数学》常用知识点
  5. LVM基础详细说明及动态扩容lvm逻辑卷的操作记录
  6. 获取验证码 60秒后重新获取
  7. 环境监测设备中,使用GPS模拟器测试TTFF和灵敏度的注意点
  8. Linux系统设置VIP(虚拟IP)的两种方式
  9. origin与matlab拟合的不同,Origin自定义模拟与matlab中cftool工具箱拟合结果比较 - 计算模拟 - 小木虫 - 学术 科研 互动社区...
  10. Python SVM手写数字识别
  11. php计算运费价格,PHP: UPS API, UPS 运费计算, UPS接口
  12. win7 增加Internet时间服务器
  13. Windows Server 2012 R2添加或删除角色和功能时提示无法打开匿名级安全令牌
  14. 基于JAVA汽车租赁系统计算机毕业设计源码+数据库+lw文档+系统+部署
  15. 纯干货!15000 字语法手册分享给你,看完搞懂,再也不担心SQL写不好了
  16. js for循环 遍历数组 遍历对象属性
  17. 食品安全溯源区块链解决方案探索
  18. STW(Stop The World)
  19. matlab表示dbm,关于信号强度单位db和dBm
  20. 简述供应商管理SRM系统

热门文章

  1. java delete file 失败_文件无法删除java.io.IOException: Unable to delete
  2. classcastexception异常_Java程序员必备:异常的十个关键知识点
  3. Kubernetes 小白学习笔记(27)--kubernetes的运维-Trouble Shooting方法
  4. oracle between 和大于小于性能_2.oracle伪例+序列
  5. JavaSE基础——Map集合、 Collections(集合工具类)
  6. 基于SSM疫情信息爬取与分析系统
  7. ios开发闹钟步骤_苹果快捷指令自动化(起床关闹钟后自动播放音乐)
  8. 图标字体化 android,Android 优化 图标文字 iconfont
  9. php多次登录失败,PHPCMS登录后台失败次数过多解决办法
  10. spring,springMVC,springBoot常用注解