说说最近所学:浅拷贝和深拷贝也叫做浅克隆和深克隆,深浅主要针对的是对象的“深度”,常见的对象都是“浅”的,也就是对象里的属性就是单个的属性,而“深”的对象是指一个对象的属性就是一个对象,也就是对象里面套对象,就像嵌套函数一样。

为什么要使用深拷贝和浅拷贝?

如果现有var obj={....}这个对象,想复制对象obj2,一贯的做法就是obj2=obj1,这时虽然obj2拥有了obj1的所有属性,但obj2却不是自由的,因为它的改动会影响到obj1,obj1的改动也会直接影响到obj2,这不是我们所希望的。所以要用到深拷贝和浅拷贝。

浅拷贝和深拷贝就是为解决对象的直接赋值后依然“链接”的问题。也就是公用一个引用,一个改变会影响另一个。下面是常见的浅拷贝:

var obj={
a:10,
b:20
}; function copy(obj){
var newobj={};
for(arr in obj)
{
newobj[arr]=obj[arr]
}
return newobj;
} obj2=copy(obj);
alert(obj2.a);//成功复制出obj的a
obj2.a=555; //更改了obj2的a
alert(obj2.a);//改变
alert(obj.a);//不变,obj2的改变不影响obj,说明拷贝后的对象和之前的对象不存在公用一个引用

浅拷贝可以解决常见的对象,但倘若对象不是常见的那种呢?比如说对象里还有子对象,那么用浅拷贝就不够彻底,比如以下代码:

var obj={
a:{
son1:'aa', //obj对象里的a也是个对象
son2:'bb'
},
b:20
}; function copy(obj){
var newobj={};
for(arr in obj)
{
newobj[arr]=obj[arr]
}
return newobj;
} obj2=copy(obj);
alert(obj2.a.son1);//成功复制出obj的a
obj.a.son1=555; //更改了obj的a.son2
alert(obj2.a.son1);//obj2的a.son1也随之改变

上面代码中,拷贝完成后更改了obj.a.son1,结果obj2.a.son1也随之改变,说明a依然存在公用同一个引用的现象,所以浅拷贝拷贝的并不彻底,不能彻底“挖到底” ,这时候深拷贝就该上场了,它能用递归的思想继续深挖,直到最底层为止。

下面就是深拷贝了:

var obj={
a:{aa:10},//浅拷贝解决不了对象中的对象
b:11
};
function deepcopy(obj){ if(typeof obj!='object') //检验是否彻底
{
return obj;
} var newobj={}; for(var attr in obj)
{
newobj[attr]=deepcopy(obj[attr]); //递归 (核心代码)
}
return newobj;
}
var obj2=deepcopy(obj);
alert(obj.a.aa);//10
alert(obj2.a.aa);//10 成功复制深层对象aa
obj2.a.aa=22; //改变obj2的a的aa
alert(obj2.a.aa);// 改变
alert(obj.a.aa);//10 不变

通过上述代码可看出深拷贝拷贝的非常彻底,做到真正意义上的杜绝相同引用的问题。

js中的浅拷贝和深拷贝的更多相关文章

  1. 浅谈js中的浅拷贝和深拷贝

    在js中如何把一个对象里的属性和方法复制给另一个对象呢? 下面举一个例子来说明: var person={name:'chen',age:18}; var son={sex:'男'}; functio ...

  2. 浅谈JS中的浅拷贝与深拷贝

    前端工程师应该都比较熟悉浅拷贝和深拷贝的概念,在日常业务代码的过程中,特别是做数据处理的时候,经常行的会遇到,比如如何在不修改原对象的基础上,重新生成一个一模一样的对象,加以利用,又或是,如何巧妙地运 ...

  3. JS中的浅拷贝与深拷贝

    浅拷贝与深拷贝的区别: 浅拷贝: 对基本类型和引用类型只进行值的拷贝,即,拷贝引用对象的时候,只对引用对象的内存地址拷贝,新旧引用属性指向同一个对象,修改任意一个都会影响所有引用当前对象的变量. 深拷 ...

  4. 【转】JAVA中的浅拷贝和深拷贝

    原文网址:http://blog.bd17kaka.net/blog/2013/06/25/java-deep-copy/ JAVA中的浅拷贝和深拷贝(shallow copy and deep co ...

  5. 搞不懂JS中赋值·浅拷贝·深拷贝的请看这里

    前言 百科定义:拷贝就是拷贝指向对象的指针,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这 ...

  6. js对象的浅拷贝与深拷贝

    浅拷贝和深拷贝都是对于JS中的引用类型而言的,浅拷贝就只是复制对象的引用(堆和栈的关系,原始(基本)类型Undefined,Null,Boolean,Number和String是存入堆,直接引用,ob ...

  7. js 数组的浅拷贝和深拷贝

    1.背景介绍 javascript分原始类型与引用类型.Array是引用类型,直接用"="号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,指向的是同一个内存地址,其中一个 ...

  8. Javascript中的浅拷贝和深拷贝

    很多开发语言中都有浅拷贝和深拷贝的说法,这里简单区分一下它们在Javascript中的区别,以及jQuery中深拷贝的实现. 在谈浅拷贝和深拷贝之前,先要屡清楚Javascript中的按值访问和按引用 ...

  9. javascript中的浅拷贝和深拷贝(拷贝引用和拷贝实例)

    作者:千锋教育链接:https://www.zhihu.com/question/23031215/answer/326129003来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

随机推荐

  1. Win7下使用Telnet命令

    在调试网络端口是否通畅的时候会经常使用到telnet命令,但是在Windows7系统下这个命令默认是不开启的. 开启Telnet命令的方法: 1.在开始程序里,打开控制面板. 2.在控制面板里,点击“ ...

  2. [转载]在Vmware ESXI中安装群晖Synology DSM 5.0 (4528)

    转载 在Vmware ESXI中安装群晖Synology DSM 5.0 (4528) 文件准备 Vmware ESXi用户安装需要的文件 NB_x64_5032_DSM_50-4528_Xpenol ...

  3. 【开源】EFW框架系列文章索引

    开源轻量级.Net框架EnterpriseFrameWork详解 ——自己动手写框架 ——适合中小企业的开发框架 ——Ajax+JqueryEasyUI+NotNetBar+MVC+WebServic ...

  4. ruby -- 进阶学习(九)定制错误跳转404和500

    在开发阶段,如果发生错误时,都会出现错误提示页面,比如:RecordNotFound之类的,虽然这些错误方便开发进行debug,但是等产品上线时,如果还是出现这些页面,对于用户来说是很不友好的. 所以 ...

  5. kubernetes学习笔记

    docker实现了更便捷的单机容器虚拟化的管理, docker的位置处于操作系统层与应用层之间; 相对传统虚拟化(KVM,XEN): docker可以更加灵活的去实现一些应用层功能, 同时对资源的利用 ...

  6. 二叉堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的Java实现(完整源码) ...

  7. Tips11:用[Rang]来限制Inspector中的变量

    我们在写脚本的过程中可能会用到很多Public变量,如INT型,Float型,这些变量在项目中可能有着一个默认的实际范围,如血量不能为负数,而且int float本来就是有一个范围的,如果对这些变量加 ...

  8. Nightwatch.js – 轻松实现浏览器的自动测试

    Nightwatch.js 是一个易于使用的,基于 Node.js 平台的浏览器自动化测试解决方案.它使用强大的 Selenium WebDriver API 来在 DOM 元素上执行命令和断言. 语 ...

  9. android resources使用总结

    http://developer.android.com/guide/topics/resources/more-resources.html http://developer.android.com ...

  10. Android学习笔记之布局技巧以及布局中的细节介绍....

    PS:休息两天,放一放手上的东西,做做总结... 学习内容: 1.Android中LinearLayout布局技巧... 2.layout中drawable属性的区别...   先简单的介绍一下dra ...