美文网首页饥人谷技术博客
应用类型和对象拷贝

应用类型和对象拷贝

作者: 南山码农 | 来源:发表于2017-07-31 19:36 被阅读0次

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

    基本类型值(字符串、数值、布尔值、null和undefined):指的是保存在栈内存中的简单数据段;
    引用类型值(对象、数组、函数、正则表达式):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象

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

    var obj1 = {a:1, b:2};//声明obj1,并将对象{a:1, b:2}的地址指针赋值给obj1
    var obj2 = {a:1, b:2};//声明obj2,并将另一个对象{a:1, b:2}(与上一个对象只是内容相同,实际为两个对象)的地址指针赋值给obj2
    console.log(obj1 == obj2);//obj1与obj2为两个不同对象的地址指针,所以不相等,结果为false
    console.log(obj1 = obj2);//将obj2赋值给obj1,即是将第二个对象的指针赋值给obj1,两者都指向第二个对象,输出结果为第二个对象object{a:1,b:2}
    console.log(obj1 == obj2);//obj1与obj2都为第二个对象的地址指针,两者相等,结果为true
    

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

    var a = 1;
    var b = 2;
    var c = { name: '饥人谷', age: 2 };
    var d = [a, b, c];    //[ 1,2,c(地址指针,与c指向的对象相同)]
    
    var aa = a;       //将a赋值给aa,则aa的值为1
    var bb = b;       //将b赋值给bb,则bb的值为1
    var cc = c;       //将c赋值给cc,c是对象的地址指针,即将原对象的地址指针赋值给cc,c和cc都指向同一个对象
    var dd = d;       //将d赋值给dd,d是对象的地址指针,即将原对象的地址指针赋值给dd,d和dd都指向同一个对象
    
    a = 11;       //a的值改变,aa的值不变,
    b = 22;       //b的值改变,bb的值不变,
    c.name = 'hello';       //c指向的对象的name属性值变为“hello”
    d[2]['age'] = 3;       //d指向的对象中第三个对象的age属性值变为3,即是原来c指向的对象的age属性变为3
    
    console.log(aa)     //结果为1
    console.log(bb)     //结果为2
    console.log(cc)     //结果为{ name: 'hello', age: 3 }
    console.log(dd)    //结果为{1,2,{ name: '饥人谷', age: 3 }}
    

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

    var a = 1                               //a的值为1
    var c = { name: 'jirengu', age: 2 }           // c的值为对象的地址指针
    
    function f1(n){
      ++n       
    }    
    function f2(obj){
      ++obj.age
    }
    
    f1(a)    
    //f1(a){
    //    var n=a(n=1);
    //    ++n(n=2);},a的值无变化
    f2(c)  
    //f2(c){
    //    var obj=c;    (将c的地址指针赋值给obj,c和obj指向同一个对象)
    //     ++obj.age;   (将cc和obj指向对象的age属性值自增,即为3)
    // }
    f1(c.age)  
    //f1(c.age){
    //    var n=c.age;   (n=3)
    //    ++n(n=2);}     c.age的值无变化 
    console.log(a)     //1
    console.log(c)     //{ name: 'jirengu', age: 3 }
    

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

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

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

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

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

    //第一种
    function clone(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]=clone(obj[key])
      }
    }
    return newObject;
    }
      第二种
    var cloneObj = JSON.parse(JSON.stringify(obj));

    相关文章

      网友评论

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

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