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 排版

posted @ 2021-09-26 19:46  白缺  阅读(32)  评论(0编辑  收藏  举报