// (数组和函数都属于对象) // 例外 //var arr = [1,2,3]; //var arr2 = arr; //对象的引用,二者共用[1,2,3],任何一者改变公共部分,其他的也会随之改变 //arr2 = [1,2,3,4]; //arr2另外给自己赋值,并没有对公共部分作出修改 //alert(arr) //1,2,3 //正常对象的引用出现的问题: /*var arr = [1,2,3]; var arr2 = arr; //对象的引用,二者共用[1,2,3],任何一者改变公共部分,其他的也会随之改变 arr2.push(4); alert(arr) //1,2,3,4*/ //处理上述情况的方法: //1,浅拷贝(不能解决所有问题,比如多层嵌套) var obj = { a : 10 }; function copy(obj) { var newObj = {}; for(var attr in obj){ newObj[attr] = obj[attr]; } return newObj; } var newObj = copy(obj); //此时是复制关系而不是引用关系,二者不再是共用某部分,所以一方的改变不会影响另一方 newObj.a = 20; alert(obj.a); //10 //2,深拷贝 //在介绍深拷贝之前先介绍先递归 //递归:1,函数执行函数自身,执行递的动作; 2,最后一次判断终止条件,执行归的动作; function test(n) { if(n==1){ return 1; }; return n*test(n-1); }; test(5) // 5*4*3*2*1 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 newObj = deepCopy(obj); //此时是复制关系而不是引用关系,二者不再是共用某部分,所以一方的改变不会影响另一方 newObj.a.b = 20; alert(obj.a.b); //10
对象的引用
最新推荐文章于 2019-08-25 20:10:04 发布