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

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

如果现有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. 批量Ping IP

    刚刚接触Python 想做点什么 听说Python 在网络方便很厉害 后来总结如下: 第一:发现公司都固定IP 每次新来同事都要猜一个没有人用的IP  很费劲 第二:我们公司有的IP可以上QQ 有的不 ...

  2. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...

  3. 当碰到unix纪元问题时strtotime怎么转时间戳(DateTime类的使用方法)

    UNIX纪元时间又称POSIX时间/新纪元时间(Epoch Time):从协调世界时1970年1月1日0时0分0秒起到现在的总秒数,不包括闰秒.正值表示1970以後,负值则表示1970年以前. Uni ...

  4. specify a file path to store the seed

    此问题是由于你的php没有开启open-ssl模块功能引起的. 所以解决方案为开启php的open_ssl模块功能. 开启open_ssl的方式很简单,打开php.ini文件,将行头的分号删除即可. ...

  5. Dewey – 标记和搜索 Chrome 浏览器书签

    Dewey 是一个 Chrome 应用程序,用于标记,搜索和排序你的 Chrome 浏览器书签.借助 Dewey,您可以添加自定义标签,生成你的书签截图,灵活快捷的方式进行搜索和排序. 您可能感兴趣的 ...

  6. DZNEmptyDataSet,优秀的空白页或者出错页封装

    简介 项目主页:https://github.com/dzenbot/DZNEmptyDataSet 提示:主要用于UITableView和UICollectionView,也可以用于UIScroll ...

  7. [Tool] Fiddle2基本使用

    Fiddler2已经成网页调试必备的工具. 简述下快捷命令: ?url =statu.=method @host bpafter url bpv method start stop 参考的文章: Fi ...

  8. [JS] jQuery选择器

    jQuery 选择器 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id=lastname 的元素 .class $(& ...

  9. GoodsAndStaffManagermentSystem----Sprint 计划1

    需求分析:茗仕茶业管理系统是个商品-员工综合管理系统. 员工管理:设置不同的职位,不同职位有不同访问权限.员工只能卖商品,财务员只有查看商品的库存量和商品销售记录:公司老板可以查看所有信息--    ...

  10. 用Qt写软件系列三:一个简单的系统工具之界面美化

    前言 在上一篇中,我们基本上完成了主要功能的实现,剩下的一些导出.进程子模块信息等功能,留到后面再来慢慢实现.这一篇来讲述如何对主界面进行个性化的定制.Qt库提供的只是最基本的组件功能,使用这些组件开 ...