JS的浅拷贝和深拷贝

浅拷贝

1.常见的情况

(1)对象等引用类型的赋值
(2)ES6新增的Object.assign() ,详细可见阮一峰老师的书;
(3)自己写一个浅拷贝

1
2
3
4
5
6
7
function shallowClone(o){
const obj = {};
for( let i in o){
obj[i] = o[i];
}
return obj;
}

2.浅拷贝的问题

指向同一块内存地址,修改新的值会影响旧的;

深拷贝

1.最简单常见的一种方法

const newObj = JSON.parse(JSON.stringify(oldObj));

该方法的问题

(1)无法实现对函数,稀疏数组,正则等特殊对象的拷贝
(2)会抛弃对象的constructor,所有的构造函数都指向了object。
(3)对象有循环引用,会报错。

补充知识点–稀疏数组简介:

数组元素的索引不一定要连续的,它们之间可以有空缺。
每个javaScript数组都有一个length属性;针对非稀疏数组,该属性就是数组元素的个数;针对稀疏数组,length比所有元素的个数要大。

2.递归实现一个深拷贝:

1
2
3
4
5
6
7
8
9
10
11
function deepClone(o1, o2) { 
for (let k in o2) {
//如果属性还是对象的话,递归继续深克隆; 普通变量的话直接复制即可
if (typeof o2[k] === 'object') {
o1[k] = {};
deepClone(o1[k], o2[k]);
} else {
o1[k] = o2[k];
}
}
}

3.总结:

想自己写一个完美的深拷贝函数,需要考虑很多种情况,还是比较麻烦的,实际生产环境中,直接使用lodash的_.cloneDeep实现深度克隆就好;

原文链接: 公众号文章

欢迎随时交流~

分享到:
Disqus 加载中...

如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理