参考自:http://www.cnblogs.com/yichengbo/archive/2014/07/10/3835882.html

一、数组的深浅拷贝

在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。

var arr01 = ["One","Two","Three"];
var arrt02 = arr01;
arrt02[1] = "test";
console.log("arr01:" + arr01); //One,test,Three
console.log("arr02:" + arrt02); //One,test,Three

像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变。

方法一:js的slice方法

var arr01 = ["One","Two","Three"];
var arrt02 = arr01.slice(0);
arrt02[1] = "test";
console.log("arr01:" + arr01); //One,Two,Three
console.log("arr02:" + arrt02); //One,test,Three

方法二:js的concat方法

var arr01 = ["One","Two","Three"];
var arrt02 = arr01.concat();
arrt02[1] = "test";
console.log("arr01:" + arr01); //One,Two,Three
console.log("arr02:" + arrt02); //One,test,Three

二、对象的深拷贝

var a={name:'yy',age:26};
var b={}; b = deepCopy(a);
b.name = 'zz';
console.log(b);  //Object { name="zz", age=26}
console.log(a);  //Object { name="yy", age=26} //定义对象的深拷贝方法
function deepCopy(obj) {
var result={};
for (var k in obj) {
result[k] = obj[k] instanceof Object ? deepCopy(obj[k]) : obj[k];
}
return result;
}

三、兼容数组和对象深拷贝的综合方法

var snail01 = {
name:'奔跑的蜗牛',
age:'26',
like:{
fruit:'orange',
sport:'football'
}
}
// 创建深拷贝方法
function deepCopy(obj){
var result,b; //result:存储拷贝数据,b:存储是否为数组的布尔值
b = obj instanceof Array;
if(obj instanceof Array || obj instanceof Object){
result = b ? [] : {};
for(var k in obj){
if(obj[k] instanceof Array || obj[k] instanceof Object){
result[k] = deepCopy(obj[k]);
}else{
result[k] = obj[k];
}
}
}
return result;
} var snail02 = deepCopy(snail01);
snail02.name = 'running snail02';
snail02.like.fruit = 'banana'; console.log(snail02); // Object { name="running snail02", age="26", like=Object { fruit="banana", sport="football"}}
console.log(snail01); // Object { name="奔跑的蜗牛", age="26", like=Object { fruit="orange", sport="football"}}

最新文章

  1. 把PDF的底色改成护眼色,这样读起文章来就不是很累了······
  2. 第三方登录分享功能-ShareSDK for iOS适配问题记录
  3. ural 2065. Different Sums
  4. 【Swing】Swing初步认知
  5. 准确率(Precision)、召回率(Recall)以及F值(F-Measure)
  6. Intellij IDEA新建一个EJB工程(二)
  7. ural1057Amount of Degrees
  8. 【转】锋狂百科:手机也能接外设 OTG技术详解
  9. 【JSP实例】指定用户计数器
  10. C socket udp方式发数据
  11. Bomb(hdu 3555)
  12. Android: Only the original thread that created a view hierarchy can touch its views 异常
  13. java实现sftp客户端上传文件夹的功能
  14. Microsoft Office Access数据库或项目包含一个对文件“dao360.dll”版本5.0.的丢失的或损坏的引用。
  15. Dos命令的介绍
  16. 向一个文件流写入一个数据块---fwrite
  17. centos 7 初始化脚本
  18. HttpRunner接口自动化测试框架
  19. 软工实践-Alpha 冲刺 (7/10)
  20. [zhuan]Android程序的真正入口Application

热门文章

  1. TRANSLATE(转换大/小写并替换字符)
  2. 谈谈WPF中的CollectionView与CollectionViewSource (1)
  3. Sphinx与coreseek
  4. C#读写txt文件的两种方法介绍 v
  5. Linux使用imagemagick的convert命令压缩图片,节省服务器空间
  6. 一步一步构建手机WebApp开发——页面布局篇
  7. android中接入twitter进行第三方登录
  8. 数据库学习(三) sql语句中添加函数 to_char,round,连接符||
  9. 第二十一篇 json,picklz,xml模块
  10. 2015年开源前端框架盘点TOP20