JavaScript的浅拷贝和深拷贝
关于拷贝的概念性解答
在JavaScript中如果直接将数组或者是对象赋值给另一个变量,这里没有新建一个副本,而只是对原有数组或对象的一个引用。
var sums = [1, 2];
var newSums = sums;
newSums[0] = 2;
console.log(sums); //显示为[2,2]
在改动newSums时,便相当于改动了原有的数组sums,因为将sums直接赋值给newSums相当于将newSums变量的地址指向了原有数组sums的地址,而不是创建一个新的空间拷贝原有数组的数据。
关于浅拷贝
浅拷贝是浅层的拷贝,即拷贝对象的浅层属性以及方法,对于对象里面套对象的情况是不能使用浅拷贝的。
浅拷贝数组和对象的方法都很多,常见的是使用数组和对象的能返回一个副本的内置函数进行浅拷贝,如数组的slice(),concat()等等。
但是为了方便,我只记下了两个(ES6支持):
对于数组的浅拷贝
var sums = [1, 2];
var newSums = [ ... sums ];
对于对象的浅拷贝
对于对象的浅拷贝只会拷贝对象的可枚举属性,方法是不会拷贝的,对象中嵌套的对象也不会
var obj = {
name: '前端猪仔',
};
var newObj = { ... obj };
关于深拷贝
深拷贝适用于对象里面嵌套对象的情况,我也记下了一个简单的方法,使用了JSON的内置函数。
var obj = { name: '前端猪仔', obj2: { age: 18, }, }; var newObj = JSON.parse(JSON.stringify(obj));
至于如何实现大量数据只改变一个属性的性能更好的深拷贝方法
我没记下来,感觉现阶段还不用接触,大家有兴趣的可以上网了解一下。
本文使用 markdown.com.cn 排版