Javascript深浅拷贝

浅拷贝

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

var a = 4;
b = a;

变量b有自己独立的空间

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

var a={};
b=a;

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

深拷贝

  • 数组
    数组的slice和concat方法能把由基础数据组成的数据,拷贝出一个新对象
var arr=['a','b','c'];
var arrCopy=arr.slice(0);
var arrCopy2=arr.concat();
  • 对象
    下面实现一种对象深拷贝;
    另外Object.assgin也能深拷贝,但它不会递归遍历拷贝,只拷贝目标对象的属性,深层属性不拷贝;
    第三种可以使用json的特性来做深度拷贝;
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));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • underscore 的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有...
    theCoder阅读 604评论 0 1
  • 简单讲呢,深浅拷贝,都是进行复制,那么区别主要在于复制出来的新对象和原来的对象是否会互相影响,改一个,另一个也会变...
    _千寻瀑_阅读 255评论 0 2
  • 如何控制alert中的换行?\n alert(“p\np”); 请编写一个JavaScript函数 parseQu...
    heyunqiang99阅读 1,099评论 0 6
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 连日的阴雨天,终于舍得放晴了。呆在家里快要发霉的人都爬出了窝,让阳光晒晒。 小区楼下,有几处站着闲聊的人。...
    水上车痕阅读 181评论 0 0