关于对象的深拷贝和浅拷贝

 

  • 浅拷贝(对象内存地址不同了,但是对象内部的引用类型的内存地址还是原来的值)
1 const obj = {
2     a: 100,
3     b: [10,20,30],
4     c: {
5         x: 10    
6     },
7     d: /^\d+$/
8 }

 

1 // 浅拷贝(一层) 不推荐
2 const obj2 = {}
3 for (let key in obj) {
4     if (!obj.hasOwnProperty(key)) break;
5     obj2[key] = obj[key]
6 }
7 // const obj2 = {...obj} 

 

  • 深拷贝

        自己项目中会用 JSON.parse(JSON.stringify(obj)) ,一般也够用了。但这方法有个弊端:对函数,正则,时间对象,数字对象等时,不适用,会有问题(函数被忽略,正则变为对象等)。而一些js库,如lodash,也有深拷贝的方法,比较复杂了。可以自己实现一个深拷贝的方法。

 1 // 深拷贝实现
 2 function deepClone(obj) {
 3     // 过滤特殊情况
 4     if (obj === nullreturn null;
 5     if (obj instanceof Function) {
 6         return new Function(obj);
 7     }
 8     if (typeof obj !== 'object') return obj;
 9     if (obj instanceof RegExp) {
10         return new RegExp(obj);
11     }
12     if (obj instanceof Date) {
13         return new Date(obj);
14     }
15     // 不直接创建空对象:克隆的结果和之前保持相同的所属类
16     const newObj = new obj.constructor(obj)
17     for (let key in obj) {
18         if (obj.hasOwnProperty(key)) {
19             newObj[key] = deepClone(obj[key])
20         }
21     }
22     return newObj;
23 }

 

posted @ 2021-03-11 14:37  scallop  阅读(83)  评论(0编辑  收藏  举报