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

引用类型与对象拷贝

作者: 怎么昵称 | 来源:发表于2017-08-01 12:11 被阅读0次
    1.引用类型有哪些?非引用类型有哪些

    引用类型: 对象 object 数组 函数 正则
    非引用类型(基本类型): number string boolean null underfined symbol

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

    var obj1 = {a:1, b:2};
    var obj2 = {a:1, b:2};

    console.log(obj1 == obj2);//false, 虽然指向的空间内容相同,但是是属于两片不同区域的对象,地址也会不一样

    console.log(obj1 = obj2);// 复制obj2指向对象的地址给obj1, 输出 object={a: 1,b:2}

    console.log(obj1 == obj2); // 比较两个地址相等,指向的也是同一片区域 ,输出true

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

    var a = 1
    var b = 2
    var c = { name: '饥人谷', age: 2 }
    var d = [a, b, c] // d数组包含a b 还有c对象

    var aa = a // aa=a=1
    var bb = b // bb=b=2
    var cc = c // cc复制了指向对象的地址c, 可对对象操作
    var dd = d //同上

    a = 11 // a赋值为11
    b = 22 // b 赋值为 22
    c.name = 'hello' //对对象的内容改动 ,name: '饥人谷' 改成 name: 'hello'
    d[2]['age'] = 3 // 改动d数组中的c中的age为3

    console.log(aa) // 1
    console.log(bb) // 2
    console.log(cc) // var cc= { name: 'hello' , age: 3}
    //改错:d[2]['age'] = 3 也改变了cc指向的对象的属性值 age: 3
    所以 age: 3,不是2

    console.log(dd) // var dd= [1,2, cc:{name:'hello', age: 3}]

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

    var a = 1
    var c = { name: 'jirengu', age: 2 }
    function f1(n){
    ++n
    }

    function f2(obj){
    ++obj.age
    }

    f1(a)
    //var n=a; var a=1; 所以 n=1;
    ++n //++n 输出2 , 然后n变为2 , 但a还是1, 输出a=1

    f2(c)
    // var obj = c = { name: 'jirengu', age: 2 }
    ++obj.age // 输出 age: 3 , 是对对象的age +1, 那么输出c就会内容变
    化, 输出 var c = { name: 'jirengu', age: 3 }

    f1(c.age)
    //f1(c.age) 隐式语句: var n=c.age; c.age发生变化后 为3,所以n=3
    //输出 ++n为4 ,所以var c = { name: 'jirengu', age: 3 }

    console.log(a) //输出 a=1
    console.log(c) // 输出 var c = { name: 'jirengu', age: 3 }

    5.过滤如下数组,只保留正数,直接在原数组上操作
    • splice() 方法用于插入、删除或替换数组的元素。
    • 注意:这种方法会改变原始数组!。

    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) //从负数的那个位置删除1个元素
    i--
    }
    }
    filter(arr)
    console.log(arr) // [3,1,2]

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

    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]); //数组.push() 给数组添加元素
    }
    }
    return newarr;
    }

    var arr2 = filter(arr) //newarr的属性给arr2
    console.log(arr2) // [3,1,2]
    console.log(arr) // [3,1,0,-1,-2,2,-5]

    7.写一个深拷贝函数,用两种方式实现
    • //hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象。

    方法1

    function copy(obj){
    var newObj={}; //开辟新空间
    for(var key in obj){
    if(obj.hasOwnProperty(key)) //判断有个对象是否有属性或对象
    if(typeof obj[key]==='null' || typeof obj[key]==='underfined' || typeof obj[key]==='string' || typeof obj[key]==='number' || typeof obj[key]==='boolean' ){ //判断对象中的属性全是基本类型时
    newObj[key]= obj[key]; // 属性复制到新空间对象
    }
    else{
    newObj[key] = copy(obj[key]);
    }//如果对象中有嵌套对象 ,再递归嵌套对象的属性
    }
    }
    return newObj;
    }
    var obj1 = {
    name: 'ruoyu',
    sex: 'male',
    age: 30,
    friend: {
    name: 'hello,
    age: 100
    }
    }
    var obj3= copy(obj1);
    obj1.name =wowo;
    console.log(obj3);

    方法2:

    var obj1={
    name:'teng',
    age: 30,
    friend: {
    name: 'hello',
    age: 100,
    }
    }
    function copy(obj){
    var newobj= JSON.parse(JSON.stringify(obj));
    return newobj;
    }
    var obj3= copy(obj1);
    console.log(obj3);

    //JSON.stringify(obj) 对象转换成字符串
    JSON.parse(JSON.stringify(obj)); 将转换来的字符串(此时的字符串已经不是之前的字符串) ,再生成为对象

    相关文章

      网友评论

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

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