javaScript 引用 浅拷贝 深拷贝
来源:互联网 发布:核聚变还有多少年知乎 编辑:程序博客网 时间:2024/06/04 18:57
一、引用
除了基本类型跟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
- javaScript 引用 浅拷贝 深拷贝
- 引用浅拷贝深拷贝
- JavaScript 深拷贝 & 浅拷贝
- python 引用 浅拷贝 深拷贝
- 深拷贝、浅拷贝、对象引用概念
- 浅拷贝、深拷贝与引用计数
- Javascript浅拷贝与深拷贝实现
- Javascript浅拷贝与深拷贝实现
- javascript中的深拷贝和浅拷贝
- javascript 深拷贝和浅拷贝
- JavaScript的深拷贝与浅拷贝
- JavaScript深拷贝和浅拷贝
- JavaScript深拷贝和浅拷贝
- javascript中的浅拷贝和深拷贝
- JavaScript的深拷贝和浅拷贝
- javascript中的深拷贝和浅拷贝?
- JavaScript 中深拷贝浅拷贝问题
- Javascript中的深拷贝与浅拷贝
- WIN7下查看CPU核心数
- 10 request&&response的学习笔记
- Otto源码详解
- Java中CountDownLatch的使用
- Android自动化测试(UiAutomator)简要介绍
- javaScript 引用 浅拷贝 深拷贝
- Leetcode 207
- 视频做背景无法自适应屏幕的问题
- Hadoop HA的部署
- java的学习路线
- web中验证码的实现
- 等价表达式 解题报告
- mysql查询 EXPLAIN 简单解释
- 用mysqli连接数据库