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

引用类型对象拷贝

作者: QQQQQCY | 来源:发表于2017-07-11 00:36 被阅读0次

    1. 引用类型有哪些?非引用类型有哪些

    基本类型值「非引用类型」(数值、布尔值、null和undefined):指的是保存在栈内存中的简单数据段;
    引用类型值(对象、数组、函数、正则):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象

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

    var obj1 = {a:1, b:2};
    var obj2 = {a:1, b:2};
    console.log(obj1 == obj2);
    console.log(obj1 = obj2);
    console.log(obj1 == obj2);
    
    >
    false  //  对象为引用类型,等式对比的是存储地址,地址显然不同
    [object Object] {
      a: 1,
      b: 2
    }
    true  //  经过第二步之后obj1和obj2的地址已经相等
    

    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) 
    console.log(bb) 
    console.log(cc)
    console.log(dd)
    
    >
    1
    2  //  基本类型等式传递的是值,改变只影响自己
    [object Object] {
      age: 3,
      name: "hello"
    }  //  改变的是储存空间中的值
    [1, 2, [object Object] {
      age: 3,
      name: "hello"
    }]    //  改变的是储存空间中的值
    

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

    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) 
    console.log(c)
    
    >
    1  //   f1() 中的++n ,改变的是f1执行上下文中AO里n 的值,与global执行上下文中的a无关联
    [object Object] {
      age: 3,
      name: "jirengu"
    } //  传递了c的地址给f2,又对地址里的值进行了改变
    

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

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

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

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

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

    var obj = {
      name:'qqqqqcy',
      sex:'man',
      age:24,
      skills:{
        level5:'photoshop',
        level4:'CAD'
      },
      interesting:['skating','game','sports']
    }
    
    //----------第一种方法----------
    function deepCopy(arr){
      var newArr={};
      console.log(newArr);
      var i=0
      for (key in arr){
        if (typeof(arr[key])==='number' || 
            typeof(arr[key])==='string' ||
            typeof(arr[key])==='boolean'||
            arr[key]===null ||
            arr[key]===undefined ) 
           newArr[key] = arr[key];
        else 
          newArr[key] = deepCopy(arr[key])
      }      
      return newArr;
    }
    
    //----------第二种方法----------
    function deepCopy2(arr){
      return JSON.parse(JSON.stringify(arr))
    }
      
    var obj2 = deepCopy(obj);                     
    
    var obj3 = deepCopy2(obj);    
      
    
    obj.age = 25;
    obj.skills.level4 = 'html';
    obj.interesting[1] = 'coding';
    console.log(obj);
    console.log(obj2);
    console.log(obj3);
    
    
    
    
    
    
    
    
    
    
    
    

    相关文章

      网友评论

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

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