JavaScript中的深浅拷贝
深浅拷贝
在JS中,数据类型分为两类:
简单数据类型:Number、Boolean、String、undefined
引用数据类型:Array、Object、Function
简单数据类型通常的操作为赋值,引用数据类型就是增删改插等操作了
深浅拷贝就是对引用数据使用的。
浅拷贝
理解:存在一个“指针”指向某块内存,再增加一个“指针”指向该内存;如果这个内存发生改变,那么,新增指针也会发生改变。
特点:无法切断数组内部引用数据类型的引用关系。
代码分析:
案例一:
<script>
var arr1 = [1,2,3,4,5]
var arr2 = arr1;
arr1.splice(2,3); // 删除索引为2开始以后的3项(包括索引为2 的项)
console.log(arr1); // [1, 2]
console.log(arr2); // [1, 2]
</script>
这是一个简单的浅拷贝,首先声明一个arr1的数组,然后又声明arr2 的数组,并且把arr1赋给arr2,然后删除arr1 的项,arr2也跟着改变,这就是浅拷贝。
案例二:
var obj1 = {
name: 'hf',
age: 23,
gender: '男',
friends: {
boy: 'zs',
gril: {
person1: 'ls',
person2: 'ww'
}
},
sayHi: function () {
consoloe.log("我有三个朋友");
}
};
var obj2 = {};
for (var k in obj1) {
obj2[k] = obj1[k];
}
delete obj1.friend.boy; //将obj1中的friends对象的boy键值对删除
console.log(obj1);
console.log(obj2);
可见,将obj1中的friends对象的boy键值对删除,obj2 中的对应项也会删除,这是为什么呢?
解释一下:通过for in 来拷贝对象时,如果键值对就是普通的name:value时,那么就把内存拷贝一份(这是深拷贝);如果对象里面的某个键值对也是对象的话,那么就是增加一个新的指针,指向obj1的键值对象,没有开辟一份新的地址,依然指向原来的地址,不会像普通的键值对再复制一份,所以就发生以上删除obj1中的friends对象的boy键值对,obj2的对应项也会删除的情况!
深拷贝
深拷贝就是新增加一个“指针”,指向一块新开辟的内存,然后拷贝某个对象或数组,当释放这个对象或数组时,这个深拷贝的对象或数组不会随着释放掉。
特点:彻底切断了数组内引用类型的引用关系。
<script>
// obj1 为将要拷贝的对象
// obj2 为拷贝到的目标对象
function deepCopy(obj1,obj2) {
for (var k in obj1) {
// 如果键值对不是object或者null类型的
if (typeof obj1[k] != "object" || typeof obj1[k] === null) {
obj2[k] = obj1[k]; // 基本数据进行浅拷贝
} else {// 如果复杂数据类型值有可能是对象,也有可能是数组,需要进行判断后再设置
obj2[k] = obj1[k] instanceof Array ? []:{};
// 再把这个是数组或者是对象的“键值对”调用函数
deepCopy(obj1[k],obj2[k]);
}
}
}
var obj1 = {
name: 'hf',
age: 23,
gender: '男',
friends: {
boy: 'zs',
gril: {
person1: 'ls',
person2: 'ww'
}
},
sayHi: function () {
consoloe.log("我有三个朋友");
}
};
var obj2 = {};
deepCopy(obj1,obj2);
delete obj1.friends.boy; //将obj1中的friends对象的boy键值对删除,但是对obj2中的数据没哟影响
console.log(obj1);
console.log(obj2);
</script>
JavaScript中的深浅拷贝的更多相关文章
- Javascript 中的深浅拷贝
工作中经常会遇到需要复制 JS 数据的时候,遇到 bug 时实在令人头疼:面试中也经常会被问到如何实现一个数据的深浅拷贝,但是你对其中的原理清晰吗?一起来看一下吧! 为什么会有深浅拷贝 想要更加透彻的 ...
- javascript中的对象拷贝
js中的数据类型 在介绍javascript中的对象的拷贝之前,我先介绍一个基础的东西,javascript中的数据类型. 我们做前端的应该都知到在es6 之前,javascript中的数据类型Boo ...
- js中的深浅拷贝
js中的深浅拷贝 js中有深拷贝.浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数.对象.数组)而言的,大概理解的就是: 浅拷贝: 拷贝出的对象c和原始对象o,c和o在key对应的val ...
- 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝
Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...
- Python 中的深浅拷贝
Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...
- javascript简单实现深浅拷贝
深浅拷贝知识在我们的日常开发中还算是用的比较多,但是之前的状态一直都是只曾听闻,未曾使用(其实用了只是自己没有意识到),所以今天来跟大家聊一聊js的深浅拷贝: 首先我们来了解一下javascript的 ...
- Python中的深浅拷贝
1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...
- Core Python Programming一书中关于深浅拷贝的错误
该书关于深浅拷贝的论述: 6.20. *Copying Python Objects and Shallow and Deep Copies "when shallow copies are ...
- Python基础【3】:Python中的深浅拷贝解析
深浅拷贝 在研究Python的深浅拷贝区别前需要先弄清楚以下的一些基础概念: 变量--引用--对象(可变对象,不可变对象) 切片(序列化对象)--拷贝(深拷贝,浅拷贝) 我是铺垫~ 一.[变量--引用 ...
随机推荐
- 017、Java中使用float型
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- ffmpeg 知识点
ffmpeg FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/ ...
- 八数码问题 IDA*搜索
#include<iostream> #include<string> #include<cmath> #include<cstring> #inclu ...
- B. RGB plants
B. RGB plants time limit per test 2.0 s memory limit per test 64 MB input standard input output stan ...
- 前端学习(22)~css问题讲解
你是如何理解 HTML 语义化的? 语义化:指对文本内容的结构化(内容语义化),选择合乎语义的标签(代码语义化). 举例:段落用 p,边栏用 aside,主要内容用 main 标签. 好处: 便于开发 ...
- Rails 第一课:环境配置 Ruby Rails RVM Heroku
安装 上传专案到 Heroku 安装 Ruby 2.3.1 Rails 5.0.0.1 RVM 1.27.0 比较幸运一个问题都未碰到 MacOS 10.12.1 配置完成系统顺利升级到10.12.2 ...
- Python 列表/元组/字典总结
序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列 ...
- redis3.2.2 集群
http://blog.csdn.net/imxiangzi/article/details/52431729 http://www.2cto.com/kf/201701/586689.html me ...
- PlayJava SpringMVC与Struts2杂谈
一 先做一个简单对比: 1. SpringMVC的入口是Servlet,核心是DispatcherServlet,Struts2是Filter,核心是FilterDispatcher 2. Sprin ...
- Spark 2.x 在作业完成时却花费很长时间结束
使用 Apache Spark 2.x 的时候可能会遇到这种现象:虽然 Spark Jobs 已经全部完成了,但是程序却还在执行.比如我们使用 Spark SQL 去执行一些 SQL,这个 SQL 在 ...