js浅拷贝和深拷贝

浅拷贝:

只复制对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意一个的值,另一个也会随之改变,这就是浅拷贝。

1.赋值

     var m = {
            a: 10,
            b: 5,
        }
        var n = m;
        n.a=15;
        console.log(m.a)//15

m.a会输出15,因为这是浅拷贝,n和m指向的是同一个堆,对象复制只是复制的对象的引用。

2.遍历对象,复制属性。

   var dog = {
            //对象的属性仍然是对象,浅拷贝拷贝到的是指针,
            指针指的对象一个改变,另一个也随之改变。
            run: {
                fast: {
                    a: 'long',
                }
            },
            speak: 'load',
            color: 'red',
        }
        var arr1 = {};
        function Cope(obj) {
            for (var i in obj) {
                arr1[i] = obj[i]
            }
            return arr1;
        }
        var arr2 = Cope(dog);
        arr2.run.fast = 'pink';
        console.log(dog.run.fast);  //pink

深拷贝:

将对象和值复制过来,两个对象修改其中任意一个的值,另一个不会改变,这就是深拷贝。

1.递归复制

var dog = {
    run: {
        fast: {
            a: 'long',
        }
    },
    speak: 'load',
    color: 'red',
}

function deepCope(obj) {
    var arr1 = {};
    //遍历对象
    for (var i in obj) {
       //判断对象的属性是否是他本身所拥有的,而非继承过来的。
        if (obj.hasOwnProperty(i)) {
            //如果对象的属性仍是对象并且不为空,复制obj属性。
            if (typeof obj[i] === "object" && obj[i] != null) {
                arr1[i] = deepCope(obj[i]);//递归,参数:是对象的属性。
            } else {
                arr1[i] = obj[i];
            }
        }
    }
    return arr1;
}
var arr2 = deepCope(dog);
arr2.run='pink';//改变其中一个的属性,另一个不会改变。
console.log(dog.run);//Object
console.log(arr2===dog) //false

2.JOSN
用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象
(函数不可以)

  var dog = {
        run: {
            fast: {
                a: 'long',
            }
        },
        speak: 'load',
        color: 'red',
    }
    var a = JSON.parse(JSON.stringify(dog));
    a.run='pink'; //改变其中一个的属性,另一个不会改变。
    console.log(dog.run);
    console.log(a===dog) //false

3.jquery

    var dog = {
        run: {
            fast: {
                a: 'long',
            }
        },
        speak: 'load',
        color: 'red',
    }

    var a = $.extend(true, {}, dog);
    a.run = 'pink'; //改变其中一个的属性,另一个不会改变。
    console.log(dog.run);
    console.log(a===dog) //false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值