美文网首页
引用类型对象拷贝

引用类型对象拷贝

作者: hhg121 | 来源:发表于2017-06-15 08:27 被阅读19次

    1.引用类型有哪些?非引用类型有哪些2.如下代码输出什么?为什么

    非引用类型有string,boolean,number,undefined和null,引用类型有对象、数组、函数、正则等。

    var obj1 = {a:1, b:2};                
    var obj2 = {a:1, b:2};
    console.log(obj1 == obj2);               //false      指向的对象不同
    console.log(obj1 = obj2);                // [object Object] {a: 1,b: 2}
    console.log(obj1 == obj2);             // true        指向相同的对象
    

    3.如下代码输出什么? 为什么

    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   aa和a独立的
    console.log(bb)        //2   aa和a独立的
    console.log(cc)        //{name:'hello',age:3}     注意这里  c和cc指向同一个对象  d中有c
    console.log(dd)       //1,2,{name:'hello',age:3}    前两个基本类型赋值的,后一个是引用类型,指向同一个对象。
    

    4.如下代码输出什么? 为什么

    var a = 1
    var c = { name: 'jirengu', age: 2 }
    function f1(n){
      ++n
    }
    function f2(obj){
      ++obj.age
    }
    f1(a)                  //基本类型,a值不影响
    f2(c)                  //引用类型,改变值
    f1(c.age)           //基本类型,不影响
    console.log(a)    // 1
    console.log(c)    //  {name:'jirengu',age:3}
    

    5.过滤如下数组,只保留正数,直接在原数组上操作

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

    6.过滤如下数组,只保留正数,原数组不变,生成新数组

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

    7.写一个深拷贝函数,用两种方式实现

    var c = {
      a : 1,
      b : 2,
      friends: {
        m: 1,
        d: 3
      },
      e : null
    };
    
    function copy(obj){
      var newobj = {};
      for(var i in obj){
        if(typeof obj[i] == 'object' && obj[i] != null){
          newobj[i] = copy(obj[i]);
        }
        else{
          newobj[i] = obj[i]; 
        }
      }
      return newobj;
    }
    var obj = copy(c);
    // c.friends.m=5;
    console.log(c);
    console.log(obj);
    
    
    var c = {
      a : 1,
      b : 2,
      friends: {
        m: 1,
        d: 3
      }
    };
    
    var obj = JSON.parse(JSON.stringify(c));
    c.friends.m=5;
    console.log(c);
    console.log(obj);
    

    相关文章

      网友评论

          本文标题:引用类型对象拷贝

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