浅拷贝和深拷贝都是对于JS中的引用类型而言的,浅拷贝就只是复制对象的引用(堆和栈的关系,原始(基本)类型Undefined,Null,Boolean,Number和String是存入堆,直接引用,object array 则是存入桟中,只用一个指针来引用值,如果拷贝后的对象发生变化,原对象也会发生变化。只有深拷贝才是真正地对对象的拷贝。

1、浅拷贝

默认是浅拷贝,只是将地址进行了复制,示例如下:

//浅拷贝
var obj1={name:"cat"};
var obj2=obj1; obj2.name="pig"; console.log(obj1.name);
console.log(obj2.name);

结果:pig

2、深拷贝

深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制了一层引用,就连值也都复制了。

只要进行了深拷贝,不会相互影响。

方法一:利用 JSON 对象中的 parse 和 stringify;

注:如果对象中含有一个函数时(很常见),就不能用这个方法进行深拷贝

var obj1 = {
name: "cat",
show:function(){
console.log(this.name);
}
};
var obj2 = JSON.parse(JSON.stringify(obj1)); obj2.name = "pig"; console.log(obj1.name);
console.log(obj2.name); obj1.show();
obj2.show(); //函数被丢失

方法二:利用递归来实现每一层都重新创建对象并赋值

//对象
var obj1 = {
name: "cat",
show:function(){
console.log(this.name);
}
}; //这种深拷贝函数不会丢失
function deepClone(obj) {
let objClone = Array.isArray(obj) ? [] : {};
if(obj && typeof obj === "object") {
for(key in obj) {
if(obj.hasOwnProperty(key)) {
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
} else {
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
var obj3=deepClone(obj1);
//输出cat
obj3.show();

最新文章

  1. X Window 程式设计
  2. C# 制作透明窗体
  3. thymeleaf 局部变量、属性优先级、注释
  4. wav文件格式分析详解
  5. Geodesic-based robust blind watermarking method for three-dimensional mesh animation by using mesh segmentation and vertex trajectory
  6. Android(java)学习笔记226:服务(service)之为什么使用服务
  7. mysql语句中----删除表数据drop、truncate和delete的用法
  8. pytorch实现DCGAN、pix2pix、DiscoGAN、CycleGAN、BEGAN以及VAE
  9. django相关网站
  10. python maximum recursion depth exceeded 处理办法
  11. day11(python)装饰器
  12. js总结:JavaScript入门
  13. Vue 系列之 样式相关
  14. Problem B. Harvest of Apples HDU - 6333(莫队)
  15. Oracle迁移至PostgreSQL工具之Ora2Pg
  16. Hotspot的minor GC
  17. Android Monkey测试入门
  18. 关于oracle数据库
  19. PHP返回Json数据函数封装
  20. ubuntu系统之难

热门文章

  1. CSPS模拟 75
  2. LeetCode刷题总结-数组篇(下)
  3. js简单函数(动态交互)
  4. 使用Typescript重构axios(三)——实现基础功能:处理get请求url参数
  5. 大数据之路week01--自学之集合_2(Iterator迭代器)
  6. 开发板,pc,虚拟机三者如何互相ping通
  7. RouterOS安装以及搭建DHCP PPPoE PPTP L2TP服务
  8. Linux基础知识回顾
  9. 判断DataGridView是否选中某行
  10. Docker从入门到实践(2)