深拷贝和浅拷贝

1.浅拷贝
指的是拷贝一个对象的时候,仅仅拷贝对象的内存地址,如果原来的对象发生变化的话,那通过浅拷贝的对象也会发生变化.也就是说基板还在,只是简单的复印(以前别人叫你小王,后来叫你老王,但是你还是你,以前没有女朋友,现在还是没有女朋友);
浅拷贝的方法:

①通过'='赋值
var a = [1,2,3,4];
var b = a;
b[2] = 2;
console.log(a+','+b)
//1,2,2,4 , 1,2,2,4

当b中的值发生变化的时候,a的值也在跟随着变化

②通过slice 对于一维数组来说比如

var a = [1,2,3,4];
var b = a.slice(0);
b[2] = 2;
console.log(a+"&"+b);
//1,2,3,4&1,2,2,4 

这个能够会返回一个新的数组实例,只是复制了引用,并不是深拷贝

③ 通过concat

var a = [1,2,3,4];
var b = a.concat();
b[2] = 2;
console.log(a+"&"+b);
//1,2,3,4&1,2,2,4

这个能够会返回一个新的数组实例,只是复制了引用,并不是深拷贝

对于②,③这种情况 如果数组中存在对象的话,就不会是像原来的样子;for example:

var a = [1,2,3,{name:'shuaige'}];
//var b = a.slice(0);
var b = a.concat();
b[3].name = 'shoushou';
console.log(a[3].name+"&"+b[3].name);
//shoushou&shoushou

 b中的发生变化的时候,a的也会发生变化

2.深拷贝
指的是复制一个对象的时候,复制的不仅仅是内存地址.举个栗子,你老婆生了个儿子,虽然拷贝了你的优秀基因,但是你和你儿子是相互独立的,你是三十岁找到的女朋友结婚,你儿子可能18就找到女朋友结婚了.你的结婚年龄不会影响你儿子的结婚年龄.

① 通过JSON.parse(JSON.stringify()) 来进行深拷贝

var x = {
    a: 1,
    b: { e: { f: 1 } },
    c: [ 1, 2, 3 ]
};
var y = JSON.parse(JSON.stringify(x));
y.b.e.f = 2;
console.log(x.b.e.f); //1

② 通过jquery 的extend

var a= {
   x: 1,
   y: 2,
   n: [1,2,3,4],
   m: { aa: { bb : 23 } }
}
var dd = $.extend({} , a);
var ee = $.extend(true , {} , a);
当改变dd中的值的时候,a的值也会发生变化;
当改变ee中的值的时候,a的值不会发生变化;

 

posted @ 2018-05-29 15:22  马小乐  阅读(126)  评论(0编辑  收藏  举报