javascript中浅拷贝和深拷贝的理解

javascript中浅拷贝和深拷贝的理解

什么是拷贝?

简单地说就是复制,对数据的复制

浅拷贝:改变拷贝者的值,被拷贝者的值也会变化

深拷贝:改变拷贝者的值,被拷贝者的值不会变化

由于基本数据类型是存放在栈中,拷贝的就是自己本身,所以就是深拷贝

1:number

var a = 1;
b = a;
console.log(a);//1
console.log(b);//1
b = 2;
console.log(a);//1
console.log(b);//2

2:string

var a = "hello";
b = a;
console.log(a);//hello
console.log(b);//hello
b = "world";
console.log(a);//hello
console.log(b);//world

3:boolean

var a = true;
b = a;
console.log(a);//true
console.log(b);//true
b = false;
console.log(a);//true
console.log(b);//false

4:null

var a = null;
b = a;
console.log(a);//null
console.log(b);//null
b = "hello";
console.log(a);//null
console.log(b);//hello

5:undefined

var a = undefined;
b = a;
console.log(a);//undefined
console.log(b);//undefined
b = "hello";
console.log(a);//undefined
console.log(b);//hello

对于引用数据类型,通过复制的形式一般就是浅拷贝

6:Array浅拷贝

复制的只是引用,a和b在栈中是不同的值,但二者在堆中是同一块区域

var a = [1,2,3];
b = a;
console.log(a);//[1,2,3]
console.log(b);//[1,2,3]
b[1] = 4;
console.log(a);//[1,4,3]
console.log(b);//[1,4,3]

7:Array深拷贝

复制的不仅是引用,还有引用值,堆中也未b开辟了一块空间

8:Array深拷贝slice(0)

var a = [1,2,3];
b = a.slice(0);
console.log(a);//[1,2,3]
console.log(b);//[1,2,3]
b[1] = 4;
console.log(a);//[1,2,3]
console.log(b);//[1,4,3]

9:Array深拷贝concat()

var a = [1,2,3];
b = a.concat();
console.log(a);//[1,2,3]
console.log(b);//[1,2,3]
b[1] = 4;
console.log(a);//[1,2,3]
console.log(b);//[1,4,3]

10:Array深拷贝deepCopy()

var a = [1,2,3];
b = [];
deepCopy(a,b)
console.log(a);//[1,2,3]
console.log(b);//[1,2,3]
b[1] = 4;
console.log(a);//[1,2,3]
console.log(b);//[1,4,3]function deepCopy(arr1,arr2){for(var i = 0,L = arr1.length;i<L;i++){arr2[i] = arr1[i]}
}

11:上面三种方法只针对一位数组,对于多维数组有局限性

12:Array多维数组深拷贝deepCopy()

var a = [[1,2,3,4],5,6];
b = [];
deepCopy(a,b)
console.log(a);//[ [ 1, 2, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 2, 3, 4 ], 5, 6 ]
b[0][1] = 7;
b[1] = 8;
console.log(a);//[ [ 1, 7, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 7, 3, 4 ], 8, 6 ]function deepCopy(arr1,arr2){for(var i = 0,L = arr1.length;i<L;i++){arr2[i] = arr1[i]}
}

13:Array多维数组深拷贝slice(0)

var a = [[1,2,3,4],5,6];
b = a.slice(0)
console.log(a);//[ [ 1, 2, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 2, 3, 4 ], 5, 6 ]
b[0][1] = 7;
b[1] = 8;
console.log(a);//[ [ 1, 7, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 7, 3, 4 ], 8, 6 ]

14:Array多维数组深拷贝concat()

var a = [[1,2,3,4],5,6];
b = a.concat()
console.log(a);//[ [ 1, 2, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 2, 3, 4 ], 5, 6 ]
b[0][1] = 7;
b[1] = 8;
console.log(a);//[ [ 1, 7, 3, 4 ], 5, 6 ]
console.log(b);//[ [ 1, 7, 3, 4 ], 8, 6 ]

15:Array多维数组深拷贝deepCopy()优化处理

var a = [[1,2,3,[7,8]],5,6];
b = [];
deepCopy(a,b)
console.log(a);//[ [ 1, 2, 3, [ 7, 8 ] ], 5, 6 ]
console.log(b);//[ [ 1, 2, 3, [ 7, 8 ] ], 5, 6 ]
b[0][1] = 7;
b[0][3][1] = 9;
b[1] = 8;
console.log(a);//[ [ 1, 2, 3, [ 7, 8 ] ], 5, 6 ]
console.log(b);//[ [ 1, 7, 3, [ 7, 9 ] ], 8, 6 ]function deepCopy(arr1,arr2){var tempArr = [];for(var i = 0,L = arr1.length;i<L;i++){if(arr1[i] instanceof Array){deepCopy(arr1[i],tempArr);arr2[i] = tempArr}else {arr2[i] = arr1[i];}}
}

16:对象浅拷贝

var a = {name:"zyb",age:23};
var b = a;
console.log(a)//{ name: 'zyb', age: 23 }
console.log(b);//{ name: 'zyb', age: 23 }a.name = "lisi";
console.log(a)//{ name: 'lisi', age: 23 }
console.log(b);//{ name: 'lisi', age: 23 }

17:对象深拷贝

var a = {name:"zyb",age:23};
var b = new Object();b.name = a.name;
b.age = a.age;
console.log(a)//{ name: 'zyb', age: 23 }
console.log(b);//{ name: 'zyb', age: 23 }a.name = "lisi";
console.log(a)//{ name: 'lisi', age: 23 }
console.log(b);//{ name: 'zyb', age: 23 }

18:对象深拷贝:内嵌对象

var a = {name:"zyb",age:23,list:{goods:"篮球",detail:"运动是好的"
}};
var b = new Object();b.name = a.name;
b.age = a.age;
b.list = a.list;
console.log(a)//{ name: 'zyb', age: 23, list: { goods: '篮球', detail: '运动是好的' } }
console.log(b);//{ name: 'zyb', age: 23, list: { goods: '篮球', detail: '运动是好的' } }a.name = "lisi";
a.list.goods = "足球";
console.log(a)//{ name: 'lisi', age: 23, list: { goods: '足球', detail: '运动是好的' } }
console.log(b);//{ name: 'zyb', age: 23, list: { goods: '足球', detail: '运动是好的' } }

19:对象深拷贝deepCopy()

var a = {name:"zyb",age:23};
var b = deepCopy(a);console.log(a)//{ name: 'zyb', age: 23 }
console.log(b);//{ name: 'zyb', age: 23 }a.name = "lisi";console.log(a)//{ name: 'lisi', age: 23 }
console.log(b);//{ name: 'zyb', age: 23 }function deepCopy(obj){var result = {};for(var key in obj){if(obj.hasOwnProperty(key)){result[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];}}return result;
}

20:对象深拷贝deepCopy():内嵌对象

var a = {name:"zyb",age:23,list:{goods:"篮球",detail:"运动是好的"
}};
var b = deepCopy(a)console.log(a)//{ name: 'zyb', age: 23, list: { goods: '篮球', detail: '运动是好的' } }
console.log(b);//{ name: 'zyb', age: 23, list: { goods: '篮球', detail: '运动是好的' } }a.name = "lisi";
a.list.goods = "足球";
console.log(a)//{ name: 'lisi', age: 23, list: { goods: '足球', detail: '运动是好的' } }
console.log(b);//{ name: 'zyb', age: 23, list: { goods: '篮球', detail: '运动是好的' } }function deepCopy(obj){var result = {};for(var key in obj){if(obj.hasOwnProperty(key)){result[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];}}return result;
}

21:jquery中对数组的拷贝

var a = [1,2,3];
var b = $.extend([],a);
console.log(a)//[1,2,3]
console.log(b)//[1,2,3]
b.push(4)
console.log(a)//[1,2,3]
console.log(b)//[1,2,3,4]

22:jquery中对对象的拷贝1

var a = {a1:1,a2:2,a3:3};
var b = $.extend({},a);
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{a1:1,a2:2,a3:3}
b.b4 = 4
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{a1:1,a2:2,a3:3,b4:4}

23:jquery中对对象的拷贝2

var a = {a1:1,a2:2,a3:3};
var b = $.extend({b0:0},a);
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{b0:0,a1:1,a2:2,a3:3}
b.b4 = 4
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{b0:0,a1:1,a2:2,a3:3,b4:4}

24:jquery中对对象的拷贝3

var a = {a1:1,a2:2,a3:3};
var c = {c1:1,c2:2,c3:3};
var b = $.extend({b0:0},a,c);
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{a1:1,a2:2,a3:3,b0:0,c1:1,c2:2,c3:3}
b.b4 = 4
console.log(a)//{a1:1,a2:2,a3:3}
console.log(b)//{a1:1,a2:2,a3:3,b0:0.b4:4,c1:1,c2:2,c3:3}

转载于:https://www.cnblogs.com/bijiapo/p/5546527.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年AI实力对决:美国领跑,中国追赶,欧盟弱势

来源&#xff1a; 智东西&#xff0c;Data Innovation美国当地时间8月18日&#xff0c;美国数据创新中心&#xff08;Center for Data Innovation&#xff09;发布针对中国、美国和欧洲三大地区的人工智能发展报告&#xff0c;报告显示&#xff0c;目前美国在AI发展中仍然保持领…

谷歌学术搜索技巧:查找一个句子的某个空应该用什么词

在写论文的时候经常遇到某个地方不知道应该用什么词比较专业的问题&#xff0c;举个例子&#xff1a; we used training strategy * in literature [10] *号处应该填什么词比较专业呢 这时可以在谷歌学术找到答案 在谷歌学术搜索中输入&#xff1a; "training strate…

python中str和input_python中eval()函数和input()函数用法解析

今天给大家讲解Python中eval()函数和input()函数的用法&#xff0c;希望通过实例的讲解之后大家能对这两个函数有更加深刻的理解。 1.eval()函数 eval(<字符串>)能够以Python表达式的方式解析并执行字符串&#xff0c;并将返回结果输出。eval()函数将去掉字符串的两个引号…

VIM操作技巧

使用vim有一段时间了&#xff0c;现在记录部分操作技巧&#xff1a; 1.查找当前光标所在的单词&#xff0c;都出现在什么位置 匹配当前光标所在的单词&#xff0c;#&#xff08;上一个&#xff09;或*&#xff08;下一个&#xff09;键 2.复制当前单词 ye可复制当前的单词&…

关于未来的蝴蝶效应,《崛起的超级智能》创作有感

来源&#xff1a;刘锋科学网博客前言&#xff1a;2019年7月5日&#xff0c;当我拿到出版社寄出的《崛起的超级智能&#xff1a;互联网大脑如何影响科技未来》时&#xff0c;仿佛在捧着一个刚出生的婴儿。不是十月怀胎&#xff0c;而是历经12年的孕育&#xff0c;2年多的艰苦生产…

python函数库_10. 标准库简介

10.标准库简介 10.1.操作系统接口 os 模块提供了许多与操作系统交互的函数: >>>import os >>>os.getcwd() # Return the current working directory C:\\Python39 >>>os.chdir(/server/accesslogs) # Change current working directory >>>…

LaTeX表格字太贴近上面表线

如图所示&#xff0c;默认情况下有时候会出现表格中的字太贴近上面表线的问题&#xff1a; 解决方法&#xff1a;在\begin{tabular}{c|cc|cc|cc}命令前面加一句\renewcommand{\arraystretch}{1.5} 效果如图&#xff1a; \renewcommand{\arraystretch}{number}命令可以调整表线和…

造出世界最大芯片的公司,Cerebras Systems到底是怎样的存在?

来源&#xff1a;TechSugar最近&#xff0c;一颗巨型芯片的诞生引爆了芯片圈。其面积42225 平方毫米&#xff0c;拥有1.2 万亿个晶体管&#xff0c;400000 个核心&#xff0c;片上内存18G字节&#xff0c;内存带宽19PByte/s&#xff0c;fabric带宽100Pbit/s。是目前芯片面积最大…

java乱码问题总结

在基于Java的编程中&#xff0c;经常会碰到汉字的处里及显示的问题&#xff0c;比如一大堆乱码或问号。 这是因为JAVA中默认的编码方式是UNICODE&#xff0c;而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码&#xff0c;故会出现此问题。以前我一般都是保证当前页与目…

matplotlib设置colorbar字体大小

只需在前面加一句 plt.rcParams[font.size] 13

python函数type的用意_python中type()是什么意思

type()是一个内建的获取变量类型的函数。 type()函数有两个用法&#xff0c;当只有一个参数的时候&#xff0c;返回对象的类型。当有三个参数的时候返回一个类对象。 语法&#xff1a;type(object) type(name, bases, dict) 具体用法&#xff1a; 一个参数type(object) 返回一个…

西方哲学史中49位哲学家的核心思想

来源&#xff1a;哲学与艺术泰勒斯——水是万物的始基这一命题开创了人类认识的一个新时代&#xff0c;拉开了从哲学的角度审视世界的大幕。阿那克西曼德——世界源于无定阿那克西曼德生于米利都&#xff0c;是泰勒斯的追随者和最出色的学生。阿那克西米尼——世界源于无限的空…

将ANSYS里的数据导入MATLAB的步骤

将ANSYS里的数据导入MATLAB的步骤&#xff1a; 1、在ansys中定义一个矩阵用来存储数据 *get,NodeNum,NODE,0,COUNT !得到模型的所有节点数 *get,nd,NODE,0,NUM,MIN !得到模型的最小节点编号 *dim,nodes,array,NodeNum !定义一个存储节点的数组 *dim,xyz,array,NodeNum,3 !定义…

第七章 异常总结

代码部分: public class Test1 {public static void main(String[] args) {try {div(1);System.out.println("正常输出结束");} catch (Exception e) {System.out.println("捕获异常");// TODO: handle exception}}public static void div(int num) throws…

latex在论文中添加行号

如果想全文连续编号 \usepackage[switch]{lineno} % 里面的选项代表双栏 \begin{document} % 文章开始 \linenumbers % 开始编号\nolinenumbers % 结束编号&#xff0c;若要全文编号&#xff0c;该条命令可不加 如果想要每页重新编号 \usepackage{lineno}…

python实战项目书 题库系统_Python实战视频教程_基于Python项目与面试题实例讲解(进阶训练篇)...

课程介绍&#xff1a; 精选50个Python项目实战与面试容易遇到的问题作为训练任务&#xff0c;每个任务都先提出问题&#xff0c;分析问题、然后给出巧妙与高效的解决办法&#xff0c;最后手把手代码实战完成任务&#xff0c;带你全面提升python项目实战核心技能与高效编程技巧.…

发表了一篇英文长文:语义信息G理论和逻辑贝叶斯推理for统计学习

来源&#xff1a;人机与认知实验室【本文是鲁晨光老师发表的一篇关于语义信息论和统计学习的论文写后感&#xff0c;发表在科学网上&#xff0c;特摘录推荐】2019-8-21 01:04 |个人分类:信息的数学和哲学|系统分类:论文交流| 信息论, 语义信息, 机器学习, 归纳, 科学哲学这是我…

Excel数据导入matlab

如果想要从Excel导入数据&#xff0c;那么就要用到xlsread函数。 具体如下&#xff1a; filename‘E:\数据\test.xlsx’; sheet3; xlRange‘C:E’; subsetAxlsread(filename,sheet,xlRange);%这样导入没有标题名字 其中sheet3;这里的3代表的是sheet从左到由的顺序&#xff0c…

Win7x64_chromeX86_相关路径

1、 C:\Users\33\AppData\Local\Google 里面有2个文件夹&#xff1a;“Chrome”、“CrashReports” 2、 C:\Program Files (x86)\Google 里面有3个文件夹&#xff1a;“Chrome”、“CrashReports”、“Update” 3、 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Goog…

win10下安装和卸载Ubuntu双系统

记录一下我装Ubuntu的过程&#xff0c;可能这不是最详细和最好的教程 首先下载diskgenius软件进行磁盘分区https://www.diskgenius.cn/ 在C盘下分出500M用于安装Ubuntu的启动项 在D盘下分出100G&#xff08;根据个人需要&#xff09;用于安装Ubuntu 之后对分出的区进行删除卷操…