javascript之浅拷贝和深拷贝
说点题外话,前两天拜读了某位前端大神的博客,内容是js设计模式。文中充满了各种比较风趣幽默的栗子,细细读起来又觉得很到位。
让读者摆脱枯燥乏味的技术恐惧感,这也是写博客的另一种境界啊。
稍稍模仿一下,会不会点击量就暴增了呢?嘿嘿……
扯得有些远了,往回拉一拉,这就是承上启下段落了。
继上一篇js基础概念总结后,陆续又发现了好多疏漏的知识点。那就花些时间搞搞基础吧,简称搞基。多么高大上的称呼啊,简直无法直视了。闹归闹,总结笔记还是不能停。
下面直接进入正题,我们来看看js中的浅拷贝和深拷贝:
1.什么是浅拷贝?
js中的赋值都为引用传递,这也就是说,在把一个对象赋值给一个变量(对象),那么这个变量(对象)所指向的仍就是原来对象的地址,引用就是浅拷贝。
看概念我们可能不太容易理解,下面拿一个简单的栗子来说说吧:
示例:1
2
3
4
5
6
7
8
9var obj1={name:'jartto'};
var obj2={};
//复制obj1
obj2=obj1;
console.log(obj2.name);//jartto
//更改obj2.name
obj2.name='somebody';
console.log(obj2.name);//somebody
console.log(obj1.name);//somebody
例子中可以看出,obj2更改了,obj1也被更改了。这说明name仍然存在公共的引用对象,我们的拷贝并不彻底,冒然的使用很有可能带来大的灾难。这时候深拷贝就该上场了,我们接着往下走。
2.什么是深拷贝?
深拷贝就是不仅复制对象的基本类,同时也复制原对象中的对象。就是说完全是新对象产生的,新对象所指向的不是原来对象的地址。
同上面的队形,我们还拿栗子来说事:
示例:1
2
3
4
5
6
7
8
9var arr1=[1,2,3];
var arr2=arr1.concat();
//输出arr2
console.log(arr2)
//更改arr2的值
arr2[0]=5;
console.log(arr1);//[1,2,3]
console.log(arr2);//[5,2,3]
arr2的值变化了,但是arr1的值并未受到影响。这也就告诉我们concat进行了一个深拷贝,arr2已经指向了新的引用地址。js中还有好多类似的例子,这里我就不一一说明啦,感兴趣你可以试试哦。
概念也说了,栗子也举了,到这里我想表达的也就over了。从网上看到有人这样解释深拷贝和浅拷贝,虽然说得是其他后台语言,但是感觉有种醍醐灌顶的认知。大伙不妨静下心来细细品味(大哥对不住啊,引用地址搞丢了,见谅啊!):
“在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!”
参考文章:
http://m.blog.csdn.net/blog/u012181244/41156763
http://www.cnblogs.com/yichengbo/archive/2014/07/10/3835882.html