深浅拷贝

在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中的深浅拷贝的更多相关文章

  1. Javascript 中的深浅拷贝

    工作中经常会遇到需要复制 JS 数据的时候,遇到 bug 时实在令人头疼:面试中也经常会被问到如何实现一个数据的深浅拷贝,但是你对其中的原理清晰吗?一起来看一下吧! 为什么会有深浅拷贝 想要更加透彻的 ...

  2. javascript中的对象拷贝

    js中的数据类型 在介绍javascript中的对象的拷贝之前,我先介绍一个基础的东西,javascript中的数据类型. 我们做前端的应该都知到在es6 之前,javascript中的数据类型Boo ...

  3. js中的深浅拷贝

    js中的深浅拷贝 js中有深拷贝.浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数.对象.数组)而言的,大概理解的就是: 浅拷贝: 拷贝出的对象c和原始对象o,c和o在key对应的val ...

  4. 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝

    Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...

  5. Python 中的深浅拷贝

    Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...

  6. javascript简单实现深浅拷贝

    深浅拷贝知识在我们的日常开发中还算是用的比较多,但是之前的状态一直都是只曾听闻,未曾使用(其实用了只是自己没有意识到),所以今天来跟大家聊一聊js的深浅拷贝: 首先我们来了解一下javascript的 ...

  7. Python中的深浅拷贝

    1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...

  8. Core Python Programming一书中关于深浅拷贝的错误

    该书关于深浅拷贝的论述: 6.20. *Copying Python Objects and Shallow and Deep Copies "when shallow copies are ...

  9. Python基础【3】:Python中的深浅拷贝解析

    深浅拷贝 在研究Python的深浅拷贝区别前需要先弄清楚以下的一些基础概念: 变量--引用--对象(可变对象,不可变对象) 切片(序列化对象)--拷贝(深拷贝,浅拷贝) 我是铺垫~ 一.[变量--引用 ...

随机推荐

  1. ACM-生化武器

    Description在一个封闭的房间里,gogo给大家表演了他的屁遁术,人果然一下没影了,但是他留下的“生化武器”,却以每秒1米的速度向上下左右扩散出去.为了知道自己会不会被“毒”到,你果断写了个算 ...

  2. 剑指offer自学系列(一)

    题目描述:输入n个整数,找出其中最小的k个数,例如,输入{4,5,1,6,2,7,3,8}这8个数字,最小的4个数字是1,2,3,4 题目分析:首先我能想到的是先对数组排序,从小到大,然后直接输出想要 ...

  3. IOCTL_DISK_GET_DRIVE_GEOMETRY

    IOCTL_DISK_GET_DRIVE_GEOMETRY: 获取磁盘参数 c++实现: #include <Windows.h> #include <winioctl.h> ...

  4. arduino 通过串口接收string,int类型数据

    串口接收string类型数据源码如下 String comdata = ""; void setup() {     Serial.begin(9600); }   void lo ...

  5. LINUX——LVM逻辑卷管理

    LVM: logical volumes manager LVM逻辑卷部署 物理卷—>卷组—>逻辑卷 第一步:关机添加磁盘:两个磁盘可以构成一个磁盘组. 第二步:查看磁盘 # ls /de ...

  6. Java中的日期表示类

    一.概述 Java中的日期类设计的比较失败,刚开始使用Date来计算时间,后来大部分Date类的方法都过时了:想用Calendar类代替Date类,然而Calendar类也是不尽如人意.下面简单介绍下 ...

  7. 吴裕雄--天生自然C++语言学习笔记:C++ 文件和流

    如何从文件读取流和向文件写入流.这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型: ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息. ifstr ...

  8. 一、VIP课程:互联网工程专题 04-Maven私服使用与插件开发

    第四课:Maven私服构建与插件开发.docx 一.maven 生命周期 知识点概要: 生命周期的概念与意义 maven 三大生命周期与其对应的phase(阶段) 生命周期与插件的关系 生命周期与默认 ...

  9. HDU - 5976 Detachment(逆元)

    题意:将一个数x拆成a1+a2+a3+……,ai不等于aj,求最大的a1*a2*a3*……. 分析: 1.预处理前缀和前缀积,因为拆成1对乘积没有贡献,所以从2开始拆起. 2.找到一个id,使得2+3 ...

  10. 本地登录ftp的时候报530错误

    root@instance-iyi104bj:~# ftp localhost Connected to localhost. (vsFTPd ) Name (localhost:root): roo ...