深拷贝和浅拷贝是javascript中一个比较复杂的问题,也是面试官最喜欢问的问题之一,通过这个为可以看出是否入门,深拷贝和浅拷贝也是初学者经常犯错一个点。

简单来说深拷贝是拷贝储存在栈中的对象,而浅拷贝是从内存中拷贝,这就涉及到数据存放位置了,总所周知,数据大体可以分为两种数据类型,一种是基本数据类型,数据结构不是很复杂,单独可以存在内存中就可以,而另一种是复杂数据类型,也叫引用数据类型,例如数组和对象,是放在栈中存储的,而基本数据类型是放在内存中的,不涉及深拷贝和浅拷贝,也可以说基本数据类型都是深拷贝

而引用类型数据存储比较复杂,例如var a=[1,3,4]  这句话的存储就是首先在内存开辟一个空间,但是内存当中不可以存储这种复杂数据类型,所以要把这种结构放到栈当中,栈相当于一个密码箱,而钥匙存在内存当中,这就构成了一个存储关系,浅拷贝var b=a简单来说就是把这份钥匙复制了一份,但内存当中的数据并没有复制,所以如果改变a相应b也会改变

而深拷贝则需要在栈中在生成一个密码箱,生成一把新钥匙(钥匙2),这样深拷贝的两种数值不会相互影响,也可以说没有任何关系了

方法:

1:jq使用,$.extend({},obj)

2:Object.assign({},obj)

这两种比较基础,估计都会使用

3:clone(obj)

var clone = function (obj) { return JSON.parse(JSON.stringify(obj)); }
这种方法有种缺陷,这种方法会忽略值为function以及undefied的字段,而且对date类型的支持也不太友好。

4:clone(obj)

var clone = function (obj) {
if(obj === null) return null
if(typeof obj !== 'object') return obj;
if(obj.constructor===Date) return new Date(obj);
var newObj = new obj.constructor (); //保持继承链
for (var key in obj) {
if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性
var val = obj[key];
newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
}
}
return newObj;
};
这种方法也就使封装最好的深拷贝的方法,以下为解释:

1、用new obj.constructor ()构造函数新建一个空的对象,而不是使用{}或者[],这样可以保持原形链的继承;
2、用obj.hasOwnProperty(key)来判断属性是否来自原型链上,因为for..in..也会遍历其原型链上的可枚举属性。
3、上面的函数用到递归算法,在函数有名字,而且名字以后也不会变的情况下,这样定义没有问题。但问题是这个函数的执行与函数名 factorial 紧紧耦合在了一起。为了消除这种紧密耦合的现象,需要使用 arguments.callee。
---------------------
作者:zuggs_
来源:CSDN
原文:https://blog.csdn.net/zuggs_/article/details/84784933
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. tensorflow学习笔记二:入门基础
  2. ffmpeg 常用命令
  3. 使用Visual Studio扩展插件Visual assist X给代码插入注释模板
  4. 机器学习&数据挖掘笔记_13(用htk完成简单的孤立词识别)
  5. Hive DDL DML SQL操作
  6. WCF揭秘(一)——简单的WCF开发实例
  7. VMWare虚拟机USB连接问题
  8. iOS项目架构文档
  9. Visual Studio2012 Lua插件--BabeLua
  10. jquery-plugin-biggerLink,highLight-层加亮_andy 阳光生活_百度空间
  11. JMETER 不同线程组 变量值 的参数传递
  12. 【Android Developers Training】 73. 布局变化的动画
  13. CentOS 下mysql ERROR&n…
  14. ActiveMQ的使用
  15. C# 将datatable导出成Excel
  16. 如何做好SQLite 使用质量检测,让事故消灭在摇篮里
  17. SDL 开发实战(二):SDL 2.0 核心 API 解析
  18. 网络通信实验(1)STM32F4 以太网简介
  19. TMS320VC5509驱动74HC595芯片
  20. typename在C++中的用法

热门文章

  1. 关于学习java虚拟机的知识整理一:jvm内存区域
  2. nodejs安装管理工具nvm的安装和使用
  3. git flow开发分支管理模型
  4. H5_0013:CSS特色样式集
  5. Python入门11 —— 基本数据类型的操作
  6. Selenium3+python自动化009- 多选框
  7. Python标准库之时间模块time与datatime模块详解
  8. AntDesign(React)学习-14 使用UMI提供的antd模板
  9. AE创建组件失败,项目中已存在对esri.arcgis.***的引用
  10. Qt VS Tools插件官方下载及安装