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

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

如果现有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. SQLite 入门教程 (终端)命令

    一.基本简介 SQLite 是一个自持的(self-contained).无服务器的.零配置的.事务型的关系型数据库引擎.因为他很小,所以也可以作为嵌入式数据库内建在你的应用程序中.SQLite 被应 ...

  2. Factorization Machine

    Factorization Machine Model 如果仅考虑两个样本间的交互, 则factorization machine的公式为: $\hat{y}(\mathbf{x}):=w_0 + \ ...

  3. Intel HAXM安装错误处理:(TV-x) is not turned on

    Android x86模拟器Intel Atom x86 System Image时提示Intel execute disable bit(xd) is not turned on 运行Elicpse ...

  4. Android获取屏幕长宽

    总结了下,我遇到的获取Android屏幕长宽的方式总共有三种.大同小异,重点在于如何获取系统中的WindowManager管理类对象,方可对数据的操作: 代码如下 /** * @return 屏幕的长 ...

  5. debian7.1 sources.list

    deb http://mirrors.163.com/debian wheezy main non-free contribdeb http://mirrors.163.com/debian whee ...

  6. [python]新手写爬虫v2.5(使用代理的异步爬虫)

    开始 开篇:爬代理ip v2.0(未完待续),实现了获取代理ips,并把这些代理持久化(存在本地).同时使用的是tornado的HTTPClient的库爬取内容. 中篇:开篇主要是获取代理ip:中篇打 ...

  7. mac ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    好久不用mysql,今天突然想用的时候, mysql -uroot -p 直接报了下面的错误 ERROR 2002 (HY000): Can't connect to local MySQL serv ...

  8. BZOJ1008 /乘法原理+快速幂 解题报告

    1008: [HNOI2008]越狱 Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生 ...

  9. TinyOS和Deluge的安装模拟(一)

    介绍 TinyOS是一款嵌入式操作系统,相信做无线传感器网络开发的同志们都不陌生.同类型的系统有不少,但是TinyOS的应用较之其他系统更为广泛.TinyOS 1.x版本和2.x版本是目前主要的两个分 ...

  10. 环信SDK与Apple Watch的结合(1)

    该系列是记录在apple watch上开发IM,用到了最近挺流行的环信IM SDK. 一.先来一段网上随处可查到的信息: 1.两种分辨率 1.65寸 312*390 1.5寸 272*340 2.开发 ...