JavaScript中浅拷贝和深拷贝的区别和实现
要理解 JavaScript中浅拷贝和深拷贝的区别,首先要明白JavaScript的数据类型
JavaScript有两种数据类型,基础数据类型和引用数据类型
基础数据类型:保存在栈内存中的简单数据段 ,有undefined,boolean,number,string,null
引用数据类型:Array,对象,Function 保存在堆内存空间中
a1 = 0;a2 = 'this is str';a3 = null 存放在栈内存中
var c =[1,2,3] 与 var d = {m:20} 变量名与内存地址存储在栈内存中,[1,2,3]与{m:20} 作为对象存储在堆内存中
基础数据类型的复制(如var a = 20 var b = a)
引用数据类型的复制 ( var m ={a:10, b:20} var n = m)
m与n指向同一个内存空间,当m或者n改变时,另一个也跟着改变
如m.a = 80 ; console.log(n.a) // 80
怎么样使引用数据类型有各自独立的内存空间
一、采用递归的方法复制拷贝对象
function deepclone(obj) { let objClone = Array.isArray(obj) ? [] : {}; if (obj && typeof obj === "object") { for (key in obj) { //if (obj.hasOwnProperty(key)) { //也可以不加 if (obj[key] && typeof obj[key] === "object") { objClone[key] = deepclone(obj[key]) } else { objClone[key] = obj[key] } //} } } return objClone } var a = [1, 2, 3, 4]; var b = deepclone(a); a[0] = 8 console.log(a, b);
Array.isArray(obj):ECMAScript 5.1 (ECMA-262) 考虑到的兼容性,可以用下面的方法实现较好的兼容
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
二、用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。
function deepclone(obj){ var _obj = JSON.stringify(obj); var cloneObj = JSON.parse(_obj); return cloneObj } var a =[1,2,3,4]; var b= deepclone(a); a[0]=8 console.log(a,b); //可以用JSON.stringify与JSON.parse实现深拷贝的原因是JSON.stringify(obj)转换成字符串,变成基本数据类型,基本类型拷贝是直接在栈内存新开空间,直接复制一份名-值,不影响之前的对象
总结:
**浅拷贝(shallow copy):只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存; **
深拷贝(deep copy):复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变;实现深拷贝主要有2种方法
(1)递归
(2)JSON.stringify结合JSON.parse
公众号:前端之攻略

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
零拷贝I:用户模式视角
英文原文地址:http://www.linuxjournal.com/article/6345。内容是关于 Zero Copy(零拷贝) 的详细介绍。在RocketMQ的Consumer 消费消息过程,使用了零拷贝技术。作用是即使被频繁调用,文件传输效率也很高。 到目前为止,几乎每个人或多或少都听过Linux下所谓的"零拷贝"功能,但我经常遇到一些对这个概念没有充分理解的人。因此,我决定写一些文章来深入研究这个问题,希望能让大家认识到这个很有用的特性。在本文中,我们从用户模式的角度来看零拷贝,因此故意省略了内核级别的细节信息。 什么是"零拷贝"? 为了更好地理解问题的解决方案,我们首先需要理解问题本身。让我们来看一下网络服务器守护进程一个简单过程所涉及的内容,该过程通过网络将存储在文件中的数据提供给客户端。这里是一些示例代码: read(file, tmp_buf, len); write(socket, tmp_buf, len); 看起来很简单;你可能会认为只有这两个系统调用没有太大的开销。实际上,事实远非如此。在这两个调用的背后,数据就已经被拷贝至少四次,并且几...
- 下一篇
阿里云容器服务同一集群下不同可用区node上的容器通信问题
创建了一个集群cluster,所属区可用区A,一并添加一个节点node-a,也在可用区A。 集群添加已有节点,该节点在同区域可用区B上,运行完脚本添加成功后成功添加节点node-b。 创建应用,起两个实例,分别运行在两个节点上。 问题:node-b节点上的服务可以访问node-a上的服务,node-a上的服务不能访问node-b上的服务。 经排查,发现两个node属于不能安全组中,node-a节点所在安全组为集群默认创建的,入规则包括了集群网段,所以node-b能访问node-a, 然而node-b所在的安全组为之前创建esc时创建的,入规则并没有集群容器的网段,所以node-a不能访问node-b。 解决办法: node-b所在安全组添加入规则,协议类型为全部,端口-1/-1,网段为集群容器网段。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6