在制作echarts图表的时候,原本想把默认的模板设置复制过来加上新的个性设置,没想到把默认的模板设置也给改动了,思考了一下这应该是JavaScript的深复制和浅复制。
例子
例子1:
var a=[1,2,3];
var b=a;
b.push(4);
console.log(b);
console.log(a);
输出结果是什么?
alert(b); => 1234 ?
alert(a); => 123 ?
实际上结果并非我们想的那样:
console.log(b);//1234
console.log(a);//1234
结果都是1234,其实,a,b是共用同一个地址,所以虽然看起来是两个对象,其实就是一个对象,a===b,这就是深复制,复制的不仅仅是数据,而且连地址一起复制过来了,相当于Windows的快捷方式,表面上看起来一个在C盘,一个在D盘,其实都是一个文件。
那么,如果我们仅仅想让b变成1234呢?a和b要不同,我们如何来做。
var a=[1,2,3];
var b = [...a,4]
console.log(b);//1,2,3,4
console.log(a);//1,2,3
以上是es6的写法,假若操作的是一个对象怎么写?
例子2:
let a={tile:'深复制'};
let b=a;
a.title='浅复制';
console.log(b);
console.log(a);
和上次的结果一样结果肯定两个都是输出浅复制。
如果只想改变a而不改变b呢?
let a={title:'深复制'};
let b={...a,title:"浅复制"};
console.log(a.title);
console.log(b.title);
结果出来如图所示:
输出结果
浅拷贝,利用for in 把a中属性拷贝给b,但是只是拷贝了一个副本,实际上当修改b的值是不会改变a的值的。
网友评论