美文网首页
2-4.引用类型和对象拷贝

2-4.引用类型和对象拷贝

作者: guidetheorient | 来源:发表于2017-05-16 23:05 被阅读0次

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

    引用类型包括对象、数组、函数、正则表达式等
    非引用类型包括数值、布尔值、字符串、null和undefined

    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  上面将obj2赋值给obj1,相当于内存地址赋给了obj,所以返回true
    

    2.

    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 非引用类型,赋值后不随a改变
    console.log(bb) //2 非引用类型,赋值后不随a改变
    console.log(cc) //{name:'hello',age:3} 引用类型与c存储的内存地址相同,所以或相互影响
    console.log(dd) //[1,2,Object] 引用类型,相互影响,给d[2]添加了属性,所以变为Object
    

    3.

    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)  //1  只是将值赋给了f1里的var n,相互不再影响
    console.log(c)  //{name:'jirengu',age:'3'}  //调用f2触发++obj.age,因为f2将obj的地址赋值给了函数内部的var obj,所以相互影响
    

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

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

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

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

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

    var obj = {
        name:'chris',
        gender:'male',
        hobby:{
            hobby1:'html',
            other:{
               hobby2:'jQuery',
            }
        }
    }
    
    function copy(obj){
        var newobj = {}
        var i
        var a = Object.keys(obj)
        for (i = 0; i < a.length; i++){
            if (!(obj[a[i]] instanceof Object)){
                newobj[a[i]] = obj[a[i]]
            } else {
                newobj[a[i]] = copy(obj[a[i]])
            }
        }
        return newobj
    }
    function copy2(obj){
        var result = JSON.parse(JSON.stringify(obj))
        return result
    }
    var obj2 = copy(obj)
    console.log(obj2)
    var obj3 = copy2(obj)
    console.log(obj3)
    

    相关文章

      网友评论

          本文标题:2-4.引用类型和对象拷贝

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