浅谈深拷贝和浅拷贝及几种实现方法

讨论深拷贝与浅拷贝之前,要先回顾一下值传递与引用传递:

值传递:

var a = 10;

var b = a;

b++;

//console.log(a,b)//a:10 b:11

引用传递:

var arr = [10,20,30,40];

var arr1 = arr;

arr1[0] = 40;

//console.log(arr,arr1);//[40,20,30,40] [40,20,30,40]

一、浅拷贝(引用传递)

(1)概念

浅拷贝:

当一个对象拷贝另一个对象的数据的时候,只要一个对象的数据发生改变另一个对象的数据也会发生改变

因为浅拷贝拷贝的是引用的地址,(所以必须在对象是多层才能拷贝,单层拷贝的是数值,多层说明里面套着对象,所以拷贝的是地址。)

(2)实现方式

方法一(ES6的方法):

Object.assign()  作用:将第二个参数及以后的参数合并到第一个对象里。

参数1:target

参数2:对象......

参数3:对象....

例:

var obj = {a:{name:"kaiqin",age:19}};

var obj1 = Object.assign({},obj);

obj1.a.name="wang"

console.log(obj1)

console.log(obj)

方法二:使用  for  in 循环,遍历每一个属性,将他们赋值给新的对象。        要求对象必须是多层的状态下才能实现浅拷贝

var obj = { a: {name:"kaiqin",age:19 } } ;

var obj2 = {a:1,b:2,c:3};

//多层

function copy(obj){

var newObj = {};

for(var key in obj){

newObj[key] = obj[key];

}

return newObj;

}

//单层

var obj1 = copy(obj);

obj1.a.name="wang"

console.log(obj1)

console.log(obj)

方法三:$.extend()

除了可以给jquery对象扩展方法外还可以实现深浅拷贝

1、布尔值 如果填true的情况下是深考贝 什么也不写就是浅拷贝

2、目标对象

3......后面所有的对象 都是需要合并的对象

var obj = {a:{name:"kaiqin",age:19}};

var obj1 = {b:{name:"wang",age:19}};

var obj2 = $.extend({},obj,obj1)

obj2.a.name="zhang";

console.log(obj2)

console.log(obj)

二、深拷贝

(1)概念

当一个对象拷贝另一个对象的数据的时候,其中一个对象的数据发生变化不会影响另一个对象的数据

因为深考贝拷贝的是对象的数据而不是地址

(2)实现方法

方法一:对象是单层的情况下

Object.assign()

var obj = {a:1,b:2,c:3}

var obj1 = Object.assign({},obj);

obj1.a = 30;

console.log(obj1,obj)

方法二:差不多比较完美

$.extend()

除了可以给jquery对象扩展方法外还可以实现深浅拷贝

1、布尔值 如果填true的情况下是深考贝 什么也不写就是浅拷贝

2、目标对象

3......后面所有的对象 都是需要合并的对象

var obj = {a:{name:"kaiqin",age:19}};

var obj1 = {b:{name:"wang",age:19}};

var obj2 = $.extend(true,{},obj,obj1);

obj2.a.name="zhang";

console.log(obj2)

console.log(obj)

方法三:JSON.parse、JSON.stringfiy      不能拷贝函数,但用在拷贝数据库数据时,不影响。因为数据库没有函数。所以推荐使用

其原理是:先将对象转换为字符串、再转换成对象,此时地址一定发生了变化,所以可以实现浅拷贝。

var obj1 = {b:{name:"wang",age:19}};

var obj2 = JSON.parse(JSON.stringify(obj1));   //此时地址发生了改变。

obj2.b.name = "kaiqin";

console.log(obj1,obj2)

原文地址:https://www.cnblogs.com/kaiqinzhang/p/9978546.html

时间: 2024-08-29 22:02:20

浅谈深拷贝和浅拷贝及几种实现方法的相关文章

浅谈深拷贝和浅拷贝

copy 实现拷贝的方法 copy 只会产生不可变的副本对象(比如NSString) mutableCopy 只会产生可变的副本对象(比如NSMutableString) 要想使用copy必须遵循协议,并且实现copyWithZone方法 - (id)copyWithZone:(NSZone *)zone 浅拷贝:指针拷贝,指向的是同一份地址空间 深拷贝:对象拷贝,指向不同的地址空间 只有一种情况是浅拷贝,那就是不可变对象使用copy才是浅拷贝,其它都是深拷贝.

【转】浅谈 CSS 清除浮动的 6 种方法

转载:浅谈 CSS 清除浮动的 6 种方法 在开发网页的时候经常需要用到各种浮动,此时便需要及时的清除浮动,否则将会导致布局出现问题 引出问题: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> .outer{ border: 1px solid black;

浅谈Linux系统中的7种运行级别及其原理

浅谈Linux系统中的7种运行级别 Linux系统7个运行级别(runlevel): 运行级别0: 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动. 运行级别1: 单用户工作状态,root权限,用于系统维护,禁止远程登陆. 运行级别2: 多用户状态(没有NFS). 运行级别3: 完全的多用户状态(有NFS),登陆后进入控制台命令行模式. 运行级别4: 系统未使用,保留. 运行级别5: X11控制台,登陆后进入图形GUI模式. 运行级别6: 系统正常关闭并重启,默认运行级别不能设为6,

浅谈小网站SEO的几点建设方法

现在很多小企业也开始建站,那该怎样做好小企业的seo呢? 1.通过seo树立品牌 对于小企业来说,当然不能做到像大型企业一样品牌人人皆知.但是与其他同等小企业.竞争对手相比,如果能够在搜索引擎结果中表现良好,就可以树立 良好的形象.所谓"排名第一就是品牌",在搜索引擎中排名第一就能让客户感觉到企业是一个充满活力.办事认真.积极上进的组织,客户第一面就打上了良 好的印象分.排名第一带来的客户在互联网真是数不甚数.那么如何通过seo树立品牌呢?第一,要使自己的企业名.地区行业关键字排名第一

浅谈局域网ARP攻击的危害及防范方法(图)

浅谈局域网ARP攻击的危害及防范方法(图)   作者:冰盾防火墙 网站:www.bingdun.com 日期:2015-03-03   自 去年5月份开始出现的校内局域网频繁掉线等问题,对正常的教育教学带来了极大的不便,可以说是谈“掉”色变,造成这种现象的情况有很多,但目前最常见的是 ARP攻击了.本文介绍了 ARP攻击的原理以及由此引发的网络安全问题,并且结合实际情况,提出在校园网中实施多层次的防范方法,以解决因ARP攻击而引发的网络安全问题,最后介 绍了一些实用性较强且操作简单的检测和抵御攻

[nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体温计.耳温枪.皮肤水分计等), 再到智能家居等领域均占有一席之地. 而蓝牙低功耗(BLE)是在蓝牙4.0协议上修改以适用低功耗应用场景的一种蓝牙协议. 随着上一股智能消费类电子大潮的到来,BLE的各种应用也像雨后春笋般在市场上铺开. 如果想 紧跟蓝牙协议的最新动态 ,可以在https://www.b

浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(转载)

转载来至beautifulzzzz,网址http://www.cnblogs.com/zjutlitao/,推荐学习 蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体温计.耳温枪.皮肤水分计等), 再到智能家居等领域均占有一席之地. 而蓝牙低功耗(BLE)是在蓝牙4.0协议上修改以适用低功耗应用场景的一种蓝牙协议. 随着上一股智能消费类电子大潮的

从JS的深拷贝与浅拷贝到jq的$.extend()方法

一.堆内存与栈内存 堆和栈都是内存中划分出来的用来存储的区域,栈为自动分配的内存空间,它由系统自动释放,堆为动态分配的内存,大小不定也不会自动释放. 二.js基本数据类型与引用类型的不同 基本数据类型(boolean,undefined,null,string,number) 1.基本数据类型存放在栈内存中 是存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配,是直接按值存放的,所以可以直接访问. 2.基本数据类型值不可变 js中给基本类型赋值或操作基本类型数据时,并没有改变基本类型的原

浅谈SQL Server中的三种物理连接操作

简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join这三种物理连接中的一种.理解这三种物理连接是理解在表连接时解决性能问题的基础,下面我来对这三种连接的原理,适用场景进行描述. 嵌套循环连接(Nested Loop Join) 循环嵌套连接是最基本的连接,正如其名所示那样,需要进行循环嵌套,这种连接方式的过程可以简单的用下图