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

函数的参数传递和对象深浅拷贝

作者: 倾国倾城的小饼干 | 来源:发表于2017-08-30 17:03 被阅读0次

    代码输出

    引用类型:对象,数组,函数,正则表达式
    非引用类型:数值,字符串,布尔值,undefined,null。
    var obj1 = {a:1, b:2};
    var obj2 = {a:1, b:2};
    console.log(obj1 == obj2);//false,因为obj1和obj2指向不同的地址
    console.log(obj1 = obj2);//{1,2}赋值的返回值是变量的值而不是true,之所以返回{1,2}是因为obj2把引用复制给了obj1,指向同一个对象。
    console.log(obj1 == obj2);//true,因为二者的地址相同

    代码输出(变量赋值)

    var a = 1
    var b = 2
    var c = { name: '饥人谷', age: 2 }
    var d = [a, b, c]

    var aa = a
    var bb = b
    var cc = c
    var dd = d

    a = 11
    b = 22
    c.name = 'hello'
    d[2]['age'] = 3

    console.log(aa) //输出1,因为基本类型赋值后两个变量相互独立,a随然改成了11,但aa不受影响。
    console.log(bb) //输出2,理由同上。
    console.log(cc)//输出{name:'hello',age:2},引用类型赋值,只是地址的复制,一个变量改变,另一个也变化,所以c.name改成了‘hello’,cc也跟着变
    console.log(dd)//输出[11,22,{name:'hello',age:3}]数组也是引用类型,所以理由同上,最后一个通过数组索引把age改成了3。

    代码输出(函数传参)

    var a = 1
    var c = { name: 'jirengu', age: 2 }

    function f1(n){
    ++n
    }
    function f2(obj){
    ++obj.age
    }

    f1(a)
    f2(c)
    f1(c.age)
    console.log(a) //输出1,基本类型传值,a和n并不互相影响,只是a的值复制给了n而已。
    console.log(c)//输出{name:'jirengu',age:3}引用类型,是地址的复制,一个变量变化,另一个也会变化。

    代码输出(过滤一个数组,在原数组上操作)

    var arr=[3,1,0,-1,-3,2,-5]
    function filter(arr){
      for(i=0;i<arr.length;i++){
        if(arr[i]<=0){
          arr.splice(i,1);
          i--;//因为删除了一个元素,索引值也要删除1。
    }
    }
    }
    filter(arr);
    console.log(arr);
    

    过滤数组,生成新的数组,只保留正数

    var arr=[3,1,0,-1,-3,2,-5]
    function filter(arr){
        var newArr=[];
        for(i=0;i<arr.length;i++){
          if(arr[i]>0){
              newArr.push(arr[i]);
    }
    }return newArr;
    }
    var arr2=filter(arr)
    console.log(arr2)
    console.log(arr)
    

    用了两种方法实现深拷贝

    var obj={
      age:100;
      friend:{
          name:'sarah';
          sex:"male";
    }
    }
    
    function copy(obj){
        var newobj = JSON.parse(JSON.stringify(obj));
        return newobj;
        }
        var obj2 = copy(obj1)
        console.log(obj2)
    
    
    function copy (obj){
        var newobj={}
        for (var key in obj){
          if (obj.hasOwnProperty(key)){
          if(typeof obj[key]==='number'||typeof obj[key]==='boolean'||typeof obj[key]==='string'||obj[key]===undefined||obj[key]===null){
              newobj[key]=obj[key]
    }else{
        newobj[key]=copy(obj[key])
    }
    }
    }return newobj
    }
    var obj2 = copy(obj)
     console.log(obj2)
    

    相关文章

      网友评论

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

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