浅拷贝和深拷贝相对于引用类型而言的。

js有两大类型值类型(基本数据类型)和引用类型(object,function,array);

值类型保存在栈上,引用类型保存在堆上。

浅拷贝只是单纯的拷贝对象的地址。

//对象的浅拷贝
var aa = { name: 'aa', age: 26, dx: { dxName: 'dxName', dxAge: 24 } };
var bb = aa;
console.log(bb===aa);     //true //这里表示是指向的同一个地址
console.log(bb.name); //aa
bb.name='bb';
console.log(aa.name); //bb
console.log(bb.name); //bb

对象保存在堆上面,而aa变量只是保存的aa对象的地址6ff65a1c;

bb=aa只是把地址6ff65a1c给了bb,所以指向的还是同一个对象,所以改了bb.name,aa.name也跟着变化了。

深拷贝是把对象完全复制一份。

var a = { name: 'aa', age: 26, dx: { dxName: 'dxName', dxAge: 24 } };
var b = new Object(); b.name = a.name;
b.age = a.age;
b.dx = {}; //开辟一块空间,然后复制
b.dx.dxName=a.dx.dxName;
b.dx.dxAge=a.dx.dxAge; b.name = 'bb';
b.dx.dxAge = 30;
console.log(a===b);
console.log('a');
console.log(a);
console.log('b');
console.log(b);

由于b是拿到的是a的一个副本,所以改变b不会影响的a

var deepCopy = function (source) {    //深拷贝函数
var result = {};
for(var key in source) {
//递归把object类型的值复制出来,这里没考虑function类型
result[key] = typeof(source[key]) === 'object' ? deepCopy(source[key]) : source[key];
}
return result;
}
var a = { name: 'aa', age: 26, dx: { dxName: 'dxName', dxAge: 24 } };
/*var b = new Object(); b.name = a.name;
b.age = a.age;
b.dx = {}; //开辟一块空间,然后复制
b.dx.dxName=a.dx.dxName;
b.dx.dxAge=a.dx.dxAge;*/
var b=deepCopy(a); b.name = 'bb';
b.dx.dxAge = 30;
console.log(a===b);
console.log('a');
console.log(a);
console.log('b');
console.log(b);

数组的浅拷贝和深拷贝

//数组浅拷贝
var arr = ["One", "Two", "Three"];
var arrto = arr;
arrto[1] = "test";
document.writeln("数组的原始值:" + arr + "<br />"); //Export:数组的原始值:One,test,Three
document.writeln("数组的新值:" + arrto + "<br />"); //Export:数组的新值:One,test,Three //数组深拷贝
var arr2 = ["One", "Two", "Three"];
var arrtoo = arr.slice(0);
arrtoo[1] = "set Map";
document.writeln("数组的原始值:" + arr2 + "<br />"); //Export:数组的原始值:One,Two,Three
document.writeln("数组的新值:" + arrtoo + "<br />"); //Export:数组的新值:One,set Map,Three

最新文章

  1. CentOS7 PostgreSQL安装
  2. rsync服务架设(数据同步|文件增量备份)
  3. 几种开源SIP协议栈对比OPAL,VOCAL,sipX,ReSIProcate,oSIP
  4. vs连接mysql出错解决方法
  5. Visual Studio自动添加头部注释 -C#开发2010-2013验证
  6. linux 安装 cenos7 和 jdk
  7. CountDownLatch源码解析
  8. 学习CountDownLatch
  9. sqlserver 收缩数据库/文件
  10. [AHOI2008] 紧急集合
  11. cocos2d-x JS 加载播放Studio帧动画的两种方法
  12. UVa 10881 Piotr&#39;s Ants (等价变换)
  13. 团队博客-第六周:Alpha阶段项目复审(科利尔拉弗队)
  14. SQL Server 数据表代码创建约束
  15. 1z0-052 q209_8
  16. C++ lower_bound 和upper_bound
  17. JAVA邻接矩阵实现拓扑排序
  18. Web服务器对比介绍
  19. redis 面试题2
  20. linux下安装或升级GCC4.8.2,以支持C++11标准[转]

热门文章

  1. codeforces 128B. String
  2. C# 通过Internet搜索网络资源
  3. Pyqt5使用
  4. 转载:FreeRTOS 配置文件详细功能解释
  5. 数理统计11:区间估计,t分布,F分布
  6. CORS OPTIONS
  7. css-next &amp; grid layout
  8. js 截取固定长度字符串但不打断单词
  9. HANNAH WHITE:从Facebook谈坚持
  10. 「NGK每日快讯」12.14日NGK公链第41期官方快讯!