重新梳理下js中的深拷贝和浅拷贝
参考链接:
http://www.cnblogs.com/st-les...
https://blog.csdn.net/hj7jay/...
浅拷贝:
1.最简单的浅拷贝就赋值。
由于js中的对象都是复杂数据类型,这种数据在内存中存储的时候,存放在堆中。当简单赋值的时候,其实是将该对象的指针指向同一个堆地址。
简单的数据类型存放在栈中,当对简单的数据类型进行赋值的时候,其实就是直接在栈中新开辟一个地方专门来存储一样的值。
所谓的浅拷贝就是,后面的对象和前面的对象在第一层数据结构中指向同一个堆地址。但是如果前面的数据不止有一层,如:
let obj = { a: {a: "hello", b: 21} };
此时,使用Object.assign()和...Object方式实现的都是浅拷贝。
此时,第一层数据虽然指向了另一个新的堆地址,但是它内部的子对象的指针却还是同一个地址。这种情况也属于浅拷贝,只不过是比那种直接赋值(直接复制堆地址)的方式要深刻一些。
2.数组和对象的浅拷贝
数组的浅拷贝,有三种方式:
(1) arr1 = arr2;
(2) arr2 = arr1.slice(0);
(3) arr2 = arr1.concat();
对象的浅拷贝,也有3种方式:
(1) obj2 = obj1;
(2) obj2 = Object.assign(obj1 ,{} )
(3) obj2 = {...obj1}
深拷贝
对象的深拷贝实际上就是,将前一个对象复制一份给后面的那个对象,不管前面的那个对象中的数据结构嵌套有多深,当改变其中一个对象中的任意深度的某个值后,另一个对象中的该值不会受任何影响。
1.当对象中的所有属性值都是简单数据类型的时候:
function easyCopy(p) {var c = {};for (var i in p) {c[i] = p[i];}c.uber = p;return c;
}
2.当要复制的对象中存在某个属性的value值是对象或者数组时:
如果像上面的简单类型那样直接赋值,那么子对象对应的属性实际上指向的是和被拷贝对象中子对象一样的内存地址。因此,只要改了一个,另一个也会跟着改变。
function deepCopy(p, c) {let c = c || {};for (let i in p) {if(! p.hasOwnProperty(i)){continue;}if (typeof p[i] === 'object') {c[i] = (p[i].constructor === Array) ? [] : {};deepCopy(p[i], c[i]);} else {c[i] = p[i];}}return c;
}Parent = {name: 'foo', birthPlaces: ['北京','上海','香港']}
var Child = deepCopy(Parent);
总结:
浅拷贝:你变我也变,嵌套对象变,就会跟着变。
深拷贝:管你怎么变,互不影响。
重新梳理下js中的深拷贝和浅拷贝相关推荐
- js中的深拷贝和浅拷贝区别
js中的深拷贝和浅拷贝与值传递和引用传递有着些许的关联,都是根据堆栈中数据的储存来传递数据. 下面主要说一下我对深拷贝和浅拷贝的理解: 简单举个例子来说明:当我们声明一个a变量并且赋值,并且让b等于a ...
- 详细讲解js中的深拷贝与浅拷贝
1 概述 深拷贝与浅拷贝在其它语言中也经常被提及到,在实际项目开发过程中也常常需要区分当前使用的到底是深拷贝还是浅拷贝,有时候在该使用深拷贝的地方,我们使用了浅拷贝,会导致深藏不露的bug. 2 数据 ...
- 理清JS中的深拷贝与浅拷贝
作者:Manjula Dube译者:前端小智来源:Medium 为了保证的可读性,本文采用意译而非直译. 浅拷贝是对象的逐位复制.创建一个新对象,该对象具有原始对象中值的精确副本.如果对象的任何字段是 ...
- JS中的深拷贝与浅拷贝
刚看完JS中的深浅拷贝,来记录分享一番,一起来开心的掉发吧. 首先了解深浅拷贝之前来看看JS中的几种数据类型,分别有String.Number.Boolean.undefined.null.Objec ...
- python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝
在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...
- python中的深拷贝与浅拷贝
浅拷贝的时候,修改原来的对象,深拷贝的对象不会发生改变. 对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷 ...
- C语言中的深拷贝和浅拷贝
http://www.cnblogs.com/zhanggaofeng/p/5421804.html C语言中的深拷贝和浅拷贝 //C语言中的深拷贝和浅拷贝 #define _CRT_SECURE_N ...
- python中关于深拷贝和浅拷贝的详解
python中关于深拷贝和浅拷贝的详解 概述 在python的语法中,有两种变量的拷贝方式 一种是深拷贝,一种是浅拷贝 我们先说深拷贝 语法 这里需要通过导入系统的copy模块中的deepcopy才可 ...
- vb.net中递归退到最外层_面试题被问到再也不慌,深究JavaScript中的深拷贝与浅拷贝...
" 点个关注,养成习惯,带你python爬虫的过程中学习前端 " JavaScript中的深拷贝和浅拷贝是前端面试中频繁被问到的一道题, 于是我也自己去查阅了一些资料, 然后动手敲 ...
最新文章
- 内存分配算法 之 首次适应-最佳适应
- c#打印,输出一句话
- 国防现代化的数据_Linux容器如何解决国防虚拟化问题
- 运行SQL文件时报Lost connection to MySQL server during query
- python操作rabbitmq操作数据
- C++之浅谈类与对象
- EMNLP21' | 细粒度情感分析新突破 —— 通过有监督对比学习方法学习隐式情感...
- ARCGIS破解教程(arcgis10.2(含ARCGIS下载地址)
- 一起看 I/O | 全新 Google Play SDK 索引助您为应用选择合适的 SDK
- UML2.51边译边学-接口
- 如何做好PPT——画图篇
- java 变量 英文_Java中的字符类型变量无论是中文,英文还是数字,都是占4字节。...
- Verilog中按键消抖检测的实现
- 分析各渠道广告,建立评分模型以及找到优质渠道的特性
- 测试方法介绍-计算模型复杂度(GMac)、模型大小(M)、计算速度(FPS)
- Hadoop3.x完全分布式运行模式配置
- 汽车电子控制器的硬件测试
- 微信小程序开发基础(03视图与逻辑)
- 使用XMAPP搭建一个简单的服务器
- 微型计算机中奇偶校验,奇偶校验位
热门文章
- 什么是OOM?常见有哪些OOM?
- 容器赋能AI-人工智能在360私有云容器服务上的实践
- elasticsearch集群选举源码解析
- 首次使用mysql_mysql-8.0.20-winx64_初次使用过程(Win7x64)
- python3 面向对象编程 下载_Python3(7) Python 面向对象编程
- python print(len(pi_string))_Python如何从文件中读取数据
- Java企业面试算法新得体会之6大数据和空间限制问题6问
- php 计算本月第一天 本月最后一天 下个月第一天
- 【SpringMVC框架】springmvc的基础知识
- mysql 海量数据库的查询优化及分页算法方案_mysql 海量数据库的查询优化及分页算法方案...