js中对象的拷贝(复制)
来源:互联网 发布:跪台办 知乎 编辑:程序博客网 时间:2024/06/07 07:22
- 一场景
- 二浅拷贝
- 三深拷贝
一、场景
除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝
将一个对象赋值给另外一个对象。
var a = [1,2,3];var b = a;b.push(4); // b中添加了一个4alert(a); // a变成了[1,2,3,4]
自定义对象
var obj = {a:10};var obj2 = obj;obj2.a = 20; // obj2.a改变了,alert(obj.a); // 20,obj的a跟着改变
这就是由于对象类型直接赋值,只是将引用指向同一个地址,导致修改了obj会导致obj2也被修改
二、浅拷贝
所以,我们需要封装一个函数,来对对象进行拷贝,通过for in 循环获取基本类型,赋值每一个基本类型,才能真正意义上的复制一个对象
var obj = {a:10};function copy(obj){ var newobj = {}; for ( var attr in obj) { newobj[attr] = obj[attr]; } return newobj;}var obj2 = copy(obj);obj2.a = 20;alert(obj.a); //10
这样就解决了对象赋值的问题。
三、深拷贝
但是这里存在隐患,如果obj中,a的值不是10,而是一个对象,这样就会导致在for in中,将a这个对象的引用赋值为新对象,导致存在对象引用的问题。
var obj = {a:{b:10}};function copy(obj){ var newobj = {}; for ( var attr in obj) { newobj[attr] = obj[attr]; } return newobj;}var obj2 = copy(obj);obj2.a.b = 20;alert(obj.a.b); //20
因此,由于这个copy对象只是对第一层进行拷贝,无法拷贝深层的对象,这个copy为浅拷贝,我们需要通过递归,来拷贝深层的对象。将copy改造成递归即可
var obj = {a:{b:10}};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);obj2.a.b = 20;alert(obj.a.b); //10
0 0
- js中对象的拷贝(复制)
- js中对象的复制,浅复制(浅拷贝)和深复制(深拷贝)
- Java中对象的复制/拷贝
- js中对象的拷贝和比较
- 详解js中对象的深浅拷贝
- C++中浅拷贝、深拷贝、对象的复制、对象的赋值
- 对象的赋值、对象的复制(拷贝构造函数)
- js中数组和对象的复制
- 类对象的浅拷贝和深拷贝(浅复制和深复制)
- js 深复制(深拷贝)和浅复制(浅拷贝)的区别
- JAVA中复制数组、对象数组拷贝
- IOS中复制对象的用法及深拷贝和浅拷贝详解
- IOS中复制对象的用法及深拷贝和浅拷贝详解
- IOS中复制对象的用法及深拷贝和浅拷贝详解
- iOS中复制对象的用法及深拷贝和浅拷贝详解
- iOS中复制对象的用法及深拷贝和浅拷贝详解
- IOS中复制对象的用法及深拷贝和浅拷贝详解
- js对象的复制
- 桥接模式
- 为什么匿名内部类和局部内部类只能访问final变量
- iOS APP提交上架流程
- 如何在Eclipse上使用Rxjava
- android屏幕的熄灭与点亮
- js中对象的拷贝(复制)
- 51nod 1305 Pairwise Sum and Divide【思维】
- hive时间操作函数
- Android - 存储目录,存储路径汇总
- maven项目中找不到Maven Dependencies解决办法
- 我的 或 个人中心 布局文件
- 打包aar不包含依赖jar文件
- Oracle clusterware
- Linux: Check version info