JS对象的引用,对象的拷贝
2016-11-21 16:13
176 查看
[Toc]
将一个对象赋值给另外一个对象。
自定义对象
这就是由于对象类型直接赋值,只是将引用指向同一个地址,导致修改了obj会导致obj2也被修改
这样就解决了对象赋值的问题。
因此,由于这个copy对象只是对第一层进行拷贝,无法拷贝深层的对象,这个copy为浅拷贝,我们需要通过递归,来拷贝深层的对象。将copy改造成递归即可
一、场景
除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝将一个对象赋值给另外一个对象。
var a = [1,2,3]; var b = a; b.push(4); // b中添加了一个4 alert(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
相关文章推荐
- JS 对象引用和深拷贝
- JS 函数与作用域 引用类型对象拷贝
- java传递是引用的拷贝,既不是引用本身,更不是对象
- 请教asp.net 中使用js 引用 document window对象的疑问
- python中的对象拷贝示例 python引用传递
- (基本数据类型值+对象)参数传递方式+对象的引用和拷贝
- js中判断Object、Array、Function等引用类型对象是否相等的方法
- js中判断Object、Array、Function等引用类型对象是否相等
- js数组:string(字符串的对象包装类型),Array(引用类型)
- JS:访问对象属性的两种方式区别之中括号引用方式
- python中的对象拷贝示例 python引用传递
- JS 内存堆栈原理(注销引用对象后带来的问题)
- java传递是引用的拷贝,既不是引用本身,更不是对象
- C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)
- python赋值和拷贝----一切皆对象,参数皆引用
- js数组及对象的深拷贝
- python 引用,拷贝,对象回收,弱引用
- C++0x标准对象拷贝,引用新方式
- Python 初体验之 对象的引用和拷贝
- 测试JS基本类型以及对象的引用