美文网首页
函数参数传递中的浅拷贝和深拷贝

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

作者: Hunter_Gu | 来源:发表于2016-12-21 23:43 被阅读67次

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

        function foo(a,b){
            console.log('a = ' + arguments[0]);
            console.log('b = ' + arguments[1]);
        }
        foo(1,2);//a = 1  b = 2
    
    • 1.基本类型拷贝时:
      以传递字符串为例:
        var a = 1;
        var b = a;
        a = 2;
        console.log(b);//1    b 不会随着 a 的改变而改变,仍然为1
    
    • 2.复杂(引用)类型拷贝时:
        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;
       }
    

    相关文章

      网友评论

          本文标题:函数参数传递中的浅拷贝和深拷贝

          本文链接:https://www.haomeiwen.com/subject/vfdcvttx.html