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

js引用类型对象拷贝

作者: 高进哥哥 | 来源:发表于2017-03-18 15:54 被阅读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,因为obj1和obj2虽然都是引用类型且内容一样,但分别存放在不同的堆内存中,返回的地址不同,所以为false
      -Object {a:1,b:2} ,将obj2赋值给obj1,obj1的地址修改为指向obj2中对象的地址,输出obj2指向堆内存中的内容
    • true,因为obj2和obj1的指针地址相同。

    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,{ name: "hello", age: 3 },[1,2,{name:"hello",age:3]
    aa和bb都是基本类型,所以将a和b的复制副本传给它们,即使修改a和b的值也不会影响,而cc是将c的堆内存中地址赋值给它,都是指向同一个内容,修改哪一个都会互相影响。dd的原理同上。

    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,{ name: 'jirengu', age: 3 }
    f1中隐式相当于n=a;将a的值复制一个副本给n,修改n的值不影响a
    而f2中隐式相当于obj=c,将c中的堆内存地址赋值给obj,指向同一个对象,修改obj.age的值会影响c。
    f1(c.age)隐式相当于n=c.age->n=3,3是基本类型,也是将值复制副本传给n,不影响c

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

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

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

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

    相关文章

      网友评论

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

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