<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>对象引用</title>
</head>
<body>
<script>
/*
* 1.基本类型是复制关系
* 一个值的改变不会影响到另一个值的变化
* */
var a = 5;
var b = a;
b += 3;
alert(b); // 8
alert(a); // 5
/*
* 2.对象和函数是引用关系
* 就是说,两个值使用同一个对象或函数,
* 其中一个改变了函数,另一个也会发生变化
* */
/*var a = [1,2,3];
var b = a;
b.push(4);
alert(b); //1,2,3,4
alert(a); //1,2,3,4*/
/*var a = [1,2,3];
// 此时的a和b指向同一个数组
var b = a;
// 这里b重新指向了一个新数组,与之前的a指向的数组断开了关系
b = [1,2,3,4];
alert(b); //1,2,3,4
alert(a); //1,2,3*/
/*
* 思考?
* 像对象引用这个情况,两个共享一份内存,这不是我们想要的
* 我们要的是复制一份新的数据到新内存中去,这样两个就不会相关了
* 因此我们需要拷贝
* */
/*
* 3.浅拷贝
* */
/*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(obj2.a); //20
alert(obj.a); //10*/
/*
* 这样的化,当obj2.a的值发生了变化,obj.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(obj2.a.b); //20
alert(obj.a.b); //20*/
/*
* 对于上述的情况,浅拷贝并不能解决对象引用的问题
* 这是我们应该编写一个深拷贝的函数
* 这里用到了递归,详情看《递归》:
* http://blog.csdn.net/super_yang_android/article/details/53925428
* */
var obj = {a: {b: 10}};
/*function deepCopy(obj) {
// 最后一次判断终止条件,开始归的动作
// 如果obj为基本数据类型时,就直接返回,只需要前拷贝
if (typeof obj !== 'object' && typeof obj !== 'function') {
return obj;
}
var newObj = {};
for ( var attr in obj ) {
newObj[attr] = arguments.callee(obj[attr]);
}
return newObj;
}
var obj2 = deepCopy(obj);
obj2.a.b = 20;
alert(obj2.a.b); //20
alert(obj.a.b); //10*/
</script>
</body>
</html>
网友评论