问:什么是浅拷贝,什么是深拷贝?
答:浅拷贝就是对对象的第一层进行复制,如果是简单数据类型直接复制内容,如果是复杂数据类型,只能复制引用地址,操作拷贝了引用地址的浅拷贝数据,会影响原数据;深拷贝就是对对象内容的完整复制,无论嵌套多少层复杂数据类型,拷贝数据与原数据是完全独立的两份数据。
问:实现浅拷贝/深拷贝的方法?
答:
实现浅拷贝:
1.const arr = arr1.slice()
2.const arr = arr1.concat(arr2)
3.const obj = Object.assign({},obj1)
4.const obj = {...obj1}
实现深拷贝:
1.json.parse(json.stringify(obj)) 缺陷:对象内容除了对象/数组格式,其余非字符串的内容也会被转为字符串,比如Date/正则
2.手写递归拷贝
function deepCopy(obj) {
if (obj === null) return null
if (typeof obj !== 'object') return obj
// 处理正则表达式
if (obj instanceof RegExp) return new RegExp(obj);
// 处理日期对象
if (obj instanceof Date) return new Date(obj);
const newObj = Array.isArray(obj) ? [] : {}
for (const key in obj) {
newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]
}
return newObj
}
3.lodash.cloneDeep
//npm i lodash -S
import lodash from 'lodash'
lodash.cloneDeep(obj)