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

引用类型和对象拷贝练习

作者: 头大如牛 | 来源:发表于2017-12-13 00:01 被阅读0次
    1. 引用类型有哪些?非引用类型有哪些

    引用类型有对象,数组,函数,正则

    非引用类型有数值,布尔,null,undefined

    1. 如下代码输出什么?为什么
    var obj1 = {a:1, b:2};
    var obj2 = {a:1, b:2};
    console.log(obj1 == obj2);  //false,obj1和obj2是两个不同的对象,指向两个不同的地址
    console.log(obj1 = obj2);   //{a:1, b:2}; 赋值语句将obj2的值赋值给obj1并输出赋值后的obj1的值
    console.log(obj1 == obj2);  //true ,因为上一句已经将obj2赋值给obj1,obj1指向与obj2相同的地址
    
    1. 如下代码输出什么? 为什么
    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为非引用类型,所以a的值为1时,赋值给aa 开辟新的内存空间,后面改变的是a的值,不影响aa
    console.log(bb) //  2 理由同上
    console.log(cc) // { name: 'hello', age: 3 }
    console.log(dd) //  { name: '饥人谷', age: 3 } c和d都是引用类型,赋值时会使指针指向同一个地址,所以后面改变的相同内存区域的数据
    
    1. 如下代码输出什么? 为什么
    var a = 1
    var c = { name: 'jirengu', age: 2 }
    
    function f1(n){
      ++n
    }
    function f2(obj){
      ++obj.age
    }
    
    f1(a) //    会默认执行var n = a;属于值传递,++n时,a不变
    f2(c) //    会默认执行var obj = c;这时会指向同一块内存区域,所以原内存区域属性进行修改时,c也会修改 即obj.age为3
    f1(c.age) // c.age值为2,相当于f1(2),相当于执行var n=2;
    console.log(a) //1
    console.log(c)  //  { name: 'jirengu', age: 3 }
    
    1. 过滤如下数组,只保留正数,直接在原数组上操作
    var arr = [3,1,0,-1,-3,2,-5]
    function filter(arr){
        for (var i = 0; i<arr.length; i++) {
            if(arr[i] <= 0) {
                arr.splice(i,1)
                i--;//  删除了一个元素,索引减一
            }
        }
    }
    filter(arr)
    console.log(arr) // [3,1,2]
    
    1. 过滤如下数组,只保留正数,原数组不变,生成新数组
    var arr = [3,1,0,-1,-3,2,-5]
    function filter(arr){
        var newArr = [];
        for (var i = 0; i < arr.length; i++) {
            if(arr[i] > 0) {
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
    var arr2 = filter(arr)
    console.log(arr2) // [3,1,2]
    console.log(arr)  // [3,1,0,-1,-2,2,-5]
    
    1. 写一个深拷贝函数,用两种方式实现
    // 声明一个对象
    var objTest = {
        name: Lucifer;
        age: 23;
        skills:{
            html,
            css,
            javascript
        }
    }
    
    //  方法一
    function deepCopy(obj) {
        var newObj={};
        for(var key in obj) {
            if(typeof obj[key] === 'object' && obj[key] !== null) {
                newObj[key] = deepCopy(obj[key]);
            }else {
                newObj[key] = oldObj[key];
            }
        }
        return newObj;
    }
    var objCopy = deepCopy(objTest);
    console.log(objCopy);
    
    //  方法二
    function deepCopy(obj) {
        var newObj = JSON.parse(JSON.stringify(obj));
        return newObj;
    }
    var objCopy = deepCopy(objTest);
    console.log(objCopy);
    

    相关文章

      网友评论

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

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