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的值不会发生变化;