对象的引用

来源:互联网 发布:翟姓 名字 知乎 编辑:程序博客网 时间:2024/05/21 18:32
// (数组和函数都属于对象)// 例外//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*1var 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