深拷贝与浅拷贝

 js中有两种数据类型:

     1.  基本类型  :  Number、String、Boolean、Null、Undefined 

     2.  复杂类型  :  Object 、Array

  深拷贝和浅拷贝只针对复杂类型的数据,因为基本类型数据的定义都会重新开辟新的内存。

  浅拷贝拷贝的是内存地址,只是增加一个指针指向已有的内存,这时多个数据共用一个内存空间;

  深拷贝是新增了指针并且新开辟了内存空间,新指针指向新的内存。

  浅拷贝:

        var a={
                  name:'WangJing',
                  sex:'女',
                  age:'25'
         };

         console.log(a.name);//'WangJing'
         var b = a ;
         b.name = '白子画';
         console.log(a.name); //白子画--浅拷贝:拷贝的是内存地址,指针指向同一个内存空间,修改其中一个其他也会改变

   修改对象b的属性值,对象a的属性值也会改变,这就是浅拷贝 (数组也是一样)

 

   深拷贝:

          var c = {}; //不要写 var c; 会报错
          function extend(a,b){
                for(var prop in a){
                          b[prop]=a[prop];
                 }
           }
           extend(a,c);
           c.name = "胡歌";
           console.log(a.name); //白子画--深拷贝:新建内存,新指针指向新的内存空间    修改其中一个不会影响另外的数据

 

 

以下代码可以解决深拷贝

                       function extend(a, b) {
				for(var prop in a) {
					//判断是否是基本数据类型
					if(typeof a[prop] === "object") {
						b[prop] = (a[prop].constructor === Array) ? [] : {};//对象和数组区别处理
						extend(a[prop], b[prop]);
					} else {
						b[prop] = a[prop];
					}
				}
			}

 

posted @ 2018-06-05 20:24  I'm_Jane  阅读(168)  评论(0编辑  收藏  举报