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

引用类型和对象拷贝

作者: 白柏更好 | 来源:发表于2017-08-12 22:10 被阅读0次

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

    • 基本类型
      Number、String、Boolean、Null、Undefined
    • 引用类型
      Array、Function、Object、RegExp

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

    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,两个变量相互复制引用类型时,指针会指向同一对象
    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)   //aa=1 , 非引用类型,只复制操作数的值而非地址
    console.log(bb)   //bb=2 , 非引用类型,只复制操作数的值而非地址
    console.log(cc)   //name:'hello',age: 3 , c是引用类型,所以cc与c指向同一个对象,从而改变对象属性后,另一个也发生相应变化。
    console.log(dd)  //a=1 b=2 name:'hello' age=3 , d也是引用类型,在下面重新对a,b赋值之前d已经完成了对a,b变量值的复制,所以之后的赋值对d不造成影响;由于c是引用类型,所以数组中的c与变量c所指的对象为同一对象(指向同一地址),改变会同时发生。
    

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

    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)   //a=1, a是基本类型,调用函数f1时,a作为参数,只是将变量值复制给n,所以n++对其无影响
    console.log(c)   //name: 'jirengu',age: 3 , c是引用类型,调用函数f2时,将整个c对象当做参数复制过去,使得函数中的参数与c指向同一个对象,所以对其age属性加一操作会改变变量c对象的age属性值;而调用函数f1时只是将对象中的age属性作为参数复制过去,函数体中的操作对原来对象的age属性不造成影响
    

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

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

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

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

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

    //第一种方式
    function copy(obj) {
        var newObj ={}
        for(var key in obj) {
            if(obj.hasOwnProperty(key)) {
                if(typeof obj[key] ==='number' || typeof obj[key] ==='string' || typeof obj[key] ==='boolean' || obj[key] === null || obj[key] === undefined) {
                newObj[key] = obj[key]
                } else {
                        newObj[key] = copy(obj[key]) 
                   }
           } 
        }
    } 
    
    //第二种方式
    
    function deepCopy() {
        var newObj = {};
        newObj = JASON.parse(JASON.stringify(oldObj));
        return newObj;
    }
    var obj2=deepCopy(oldObj);
    console.log(obj2)
    

    相关文章

      网友评论

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

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