美文网首页
JS赋值、浅拷贝与深拷贝

JS赋值、浅拷贝与深拷贝

作者: 苹果咏 | 来源:发表于2019-10-06 20:19 被阅读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);//不会相互影响
    

    相关文章

      网友评论

          本文标题:JS赋值、浅拷贝与深拷贝

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