Javascript深浅拷贝

2017-02-23  本文已影响17人  Addy_Zhou

浅拷贝

1.基本数据类型 是存在栈中的,所以=赋值,都会创建一个新的空间,例如

var a = 4;
b = a;

变量b有自己独立的空间

2.对象数据类型 是存在堆中的,=赋值,并不会创建新的空间,只是引用,例如

var a={};
b=a;

变量b只是一个引用,指向了a的空间,这其实就是浅拷贝

深拷贝

var arr=['a','b','c'];
var arrCopy=arr.slice(0);
var arrCopy2=arr.concat();
1.Object.prototype.deepCopy=function(){
    var obj=null;//用于最后返回一个对象,这个对象是深复制的结果
    for(var attr in this) {//遍历这个对象的每一个属性
        if(this.hasOwnProperty(attr)){//主要是递归自有属性
            if(typeof (this[attr]==='object')){//如果对象的属性是一个对象,就递归复制它的每一个属性
                if(this[attr]===null){//如果对象为null
                    obj[attr]=null;
                }else if(Object.prototype.toString(this[attr])==='[object Array]'){//如果是个数组
                    obj[attr]=[];
                    for(var i=0;i<this[attr].length;i++){
                        obj[attr].push(this[attr][i].deepCopy());
                    }
                }else{//object
                    obj[attr]=this[attr].deepCopy();
                }
            }else{
                obj[attr]=this[attr];
            }
        }
    }
    return obj;
}

2.Object.assign(target, ...sources);

3.JSON.parse(JSON.stringify(target));
上一篇 下一篇

猜你喜欢

热点阅读