函数参数传递中的浅拷贝和深拷贝

2016-12-21  本文已影响67人  Hunter_Gu

函数中传递的参数,可以在函数内部通过 arguments 这个类数组对象进行访问。

    function foo(a,b){
        console.log('a = ' + arguments[0]);
        console.log('b = ' + arguments[1]);
    }
    foo(1,2);//a = 1  b = 2
    var a = 1;
    var b = a;
    a = 2;
    console.log(b);//1    b 不会随着 a 的改变而改变,仍然为1
    var obj1 = {"name": "Couzin",
                "age": 22
            };
    var obj2 = obj1;
    obj1["name"] = "Hunter";
    console.log(obj2['name']);//"Hunter"

引用类型的本质是:变量中保存的是指针,指针指向内存中的位置,该位置保存着对象。
引用类型有:对象、函数、数组、正则。


   function sum(num){
/*助于理解
       var num = count;
*/
       return (num + 10);
   }
   var count = 20;
   sum(count);
   console.log(count);//count 的值不会改变
   function modifyObj(obj){
/*助于理解
       var obj = obj1;
*/
       obj.age = 22;
   }
   var obj1 = {
       "name": "Couzin",
       "age": 10
   };
   modifyObj(obj1);
   console.log(obj1);//改变了 {name: "Couzin", age: 22}

所以,对于引用类型,需要避免在拷贝后发生的这种情况。

   function getArr(arr){
       var arrtemp = [];
       for(var i = 0;i < arr.length;i ++){
           arrtemp[i] = arr[i];
       }
       return arrtemp;
   }

这种方法只能拷贝一层,即 [1,2,3] 类型的对象;对于 [1,2,[a,b]] 类型的对象是无效的。

   function copyObj(arr){
       var arrtemp = [];
       for(var i = 0;i < arr.length;i ++){
           if((typeof arrtemp[i]) === "object"){
               arrtemp[i] = copyObj(arr[i]);
           }else{
               arrtemp[i] = arr[i];
           }
       }
       return arrtemp;
   }
上一篇 下一篇

猜你喜欢

热点阅读