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

Web19.引用类型&对象拷贝

作者: FiredEarthMusic | 来源:发表于2017-11-09 21:48 被阅读11次

    基本类型 引用类型

    基本类型值(数值 布尔值 null和undefined) 指的是保存在栈内存中的简单数据段

    引用类型值(对象 数组 函数 正则) 指的是保存在堆内存中的对象 变量中保存的
    实际上只是一个指针,指针执行内存中的另一个位置,由该位置保存对象
    可以理解为存的是地址

    <script>
        var a
        var b
        var c
        
        var a = 1
        var b = 2
        var c = {name: 'ruoyu'}  //0x0033
    
        var aa = a
        var bb = b
        var cc = c
    
        a = 100
        b = 200
        c.name = 'jirengu'
    
        console.log(aa)  //1
        console.log(bb)  //2
        console.log(cc)  //Object {name: "jirengu"}
    
        //c = {name: 'fem'}  //0x0044
    </script>
    
    //函数的参数传递
    
    function inc(n){
       //var n = a
        n++;
    }
    var a = 10;
    inc(a);
    console.log(a);  //10
    
    
    
    function incObj(obj){
        //var obj = o
       obj.n++;
    }
    var o = {n: 10};
    incObj(o);
    console.log(o);   //11
    
    var arr = [3, 4, 5]  //0x0088
    
    function squireArr(arr){
       //相当于 var arr = 0x0088
        for(var i = 0; i < arr.length; i++){
            arr[i] = arr[i] * arr[i]
        }
    }
    squireArr(arr)
    console.log(arr)
    
    
    
    
    function squireArr2(arr){
        var newArr = []
        for(var i = 0; i < arr.length; i++){
            newArr[i] = arr[i] * arr[i];
        }
        return newArr;
    }
    
    var arr2 = squireArr2(arr)
    console.log(arr2);
    
    浅拷贝
    
    var obj = {
        age: 100,
        friend: {
            name: 'ruoyu',
            sex: 'male'
        }
    }
    
    
    function shadowCopy(obj){
        var newObj = {}
        for(var key in obj){
            newObj[key] = obj[key]
        }
        return newObj
    }
    var obj3 = shadowCopy(obj)
    obj.age = 400
    console.log(obj3)
    
    //深拷贝
    function copy(obj){
        
        var newObj = {};
        for(var key in obj){
            if(obj.hasOwnProperty(key)){
                if(typeof obj[key] === 'number' || typeof obj[key] === 'boolean' || typeof obj[key] === 'string' || obj[key] === undefined || obj[key] === null){
                    newObj[key] === obj[key]
                }else{
                    newObj[key] = copy(obj[key])  
                }
            }
        }
        return newObj
    
    }
    var obj3 = copy(obj)
    

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

    1.png
    基本类型值(数值 布尔值 null和undefined) 指的是保存在栈内存中的简单数据段
    引用类型值(对象 数组 函数 正则) 指的是那些保存在堆内存中的对象,变量中
    保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象  可以理解为存的是地址
    
    console.log(obj1 == obj2)
    //false  由于obj1与obj2所存储的位置不同,所以false
    console.log(obj1=obj2)
    //{a:1, b:2}  把obj2赋值给obj1  输出Object {a:1, b:2}
    console.log(obj1 == obj2)
    //把obj2赋值给obj1  所以obj2与obj1存储的位置是一样的  所以为true
    

    题目2:如下代码输出什么? 为什么

    2.png
    console.log(aa)
    //1   值传递   a aa b bb都会开辟一个属于自己的栈空间
    console.log(bb)
    //2    值传递
    console.log(cc)
    //{name: 'hello', age: 3}        对象的赋值是引用传递  cc和c都是指向同一块堆内存
    console.log(dd)
    //[1, 2, [name: 'hello', age: 3]    数组的赋值也是引用传递
    

    题目3:如下代码输出什么? 为什么

    3.png
    f1(a)
    //a = 1   有赋值动作  var n = a, ++n, a依然不变
    f2(c)
    //c = {name: 'jirengu', age: 3}
    f1(c.age)
    //取出c.age = 3 默认执行 var n = 3   不影响c.age
    console.log(a)
    //1
    console.log(c)
    //{name: 'jirengu',age:3}
    

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

    4.png

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

    5.png

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

    相关文章

      网友评论

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

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