关于对象的深拷贝和浅拷贝
- 浅拷贝(对象内存地址不同了,但是对象内部的引用类型的内存地址还是原来的值)
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 === null) return 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 }