JS赋值、浅拷贝与深拷贝

2019-10-06  本文已影响0人  苹果咏

赋值

基本数据类型赋值,赋值之后两个变量互不影响

    var dd = 89
    var tt = dd
    tt = 90
    console.log(dd);//89
    console.log(tt);//90

对引用类型进行赋址,两个变量指向同一个对象,改变变量 a 之后会影响变量 b,哪怕改变的只是对象 a 中的基本类型数据。

    var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
    var o = {};
    o = obj
    o.msg.age = 8
    console.log(o);
    console.log(obj);//里面msg.age都是8

浅拷贝

浅拷贝只拷贝最外一层

  var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
    var o = {};

//浅拷贝只拷贝最外一层
        for (var k in obj) {
          // k 是属性名   obj[k] 属性值
             o[k] = obj[k];
        }
         console.log(o);
         o.msg.age = 20;
         console.log(obj);//第二层的数据会随着变化

        obj.name = "jj";
        console.log(o);
        console.log(obj);//最外层的数据不会随着变化

//ES6写法
Object.assign(o, obj);
console.log(o);
o.msg.age = 20;
console.log(obj);//里面的层还是会随着变化

深拷贝

深拷贝拷贝多层

    var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            },
            color: ['pink', 'red']
        };
    var o = {};

    function deepCopy(newobj, oldobj){
        for(i in oldobj){
            var item = oldobj[i]
            //判断是否为数组
            if(item instanceof Array){
                newobj[i] = []
                deepCopy(newobj[i], item) 
            //判断是否为对象
            }else if(item instanceof Object){
                newobj[i] = {}
                deepCopy(newobj[i], item)
            }else{
                //简单数据类型
                newobj[i] = item;
            }
        }
    }
    deepCopy(o, obj);
    console.log(o);
    o.msg.age = 20;
    console.log(obj);//不会相互影响
上一篇下一篇

猜你喜欢

热点阅读