美文网首页
引用类型的对象深拷贝(有部分数组题目)

引用类型的对象深拷贝(有部分数组题目)

作者: Lucien_d70a | 来源:发表于2017-10-07 15:04 被阅读0次

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

    • 引用类型有对象,数组,函数,正则表达式等。
    • 非引用类型有,数值,字符串,布尔,null,undefined。

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

    var obj1 = {a:1, b:2};
    var obj2 = {a:1, b:2};
    console.log(obj1 == obj2);//false   内容相同而已,但是指向的是对内存中两个不同的对象。
    console.log(obj1 = obj2);//{a:1,b:2}  obj2的指针赋给obj1,现在他们处于两个不同的栈内存,指向同一个堆内存。
    console.log(obj1 == obj2);//true  所以为true
    

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

    var a = 1
    var b = 2
    var c = { name: '饥人谷', age: 2 }
    var d = [a, b, c]  //[1,2,{ name: '饥人谷', age: 2 }]
    
    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   //b改变为22而已  bb不变
    console.log(cc)//{name:"hello",age: 3 }   //cc跟c指向同一个对象,c变,cc也变,同时c的地址也传给了d,d的值包含了c的地址,那么d变,c也变了。
    console.log(dd)//[1,2,{ name: '饥人谷', age: 3 }]  //数组也是引用类型,d跟dd指向同一对象,所以d变,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) //n=3    这里只是引用了对象里面的值,不是地址的复制。
    console.log(a) //1  基本类型的值是覆盖,n=a的值,a不变。
    console.log(c)//{ name: 'jirengu', age: 3 }  //f2的时候c把地址传给了obj,他们两同时指向同一个对象,obj变。c变。
    

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

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

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

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

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

    //第一种
    function copy(obj){
    var newObject={};
    for (var key in obj) {
        if(typeof obj[key] === 'number'||typeof obj[key] === 'boolean'||typeof obj[key] === 'string'||obj[key] ===undefined||obj[key] === null){
          newObject[key]=obj[key];
        } else{ 
            newObject[key]=copy(obj[key])
        }
    }
    return newObject;
    }
    //第二种
    var cloneObj = JSON.parse(JSON.stringify(obj));

    相关文章

      网友评论

          本文标题:引用类型的对象深拷贝(有部分数组题目)

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