js的深浅拷贝
1.浅拷贝
只是复制基本类型的数据或者指向某个对象的指针,而不是复制对象本身,源对象和目标对象共享同一块内存;如果对目标对象修改,那么源对象也会被修改。
- 对象实现
const shallowClone = sourceObj => { let targetObj = {} for (const key in sourceObj) { targetObj[key] = sourceObj[key] } return targetObj }
- 数组实现
const shallowClone = sourceArr => { let targetArr = [] targetArr = [].concat(sourceArr) return targetArr }
- Object.assign
const shallowClone = source => { return Object.assign({}, source) }
2.深拷贝
创建一个新的对象,重新分配堆内存地址,实现源对象和目标对象的完全分离。
- JSON字符串化(缺点:function 会变成 undefined)
const deepClone = source => { return JSON.parse(JSON.stringify(source)) }
- 递归
const deepClone = source => { if (source && typeof source === 'object') { let cloneObj = {} for (const key in source) { const val = source[key] if (val && typeof val === 'object') { cloneObj[key] = deepClone(val) } else { cloneObj[key] = val } } return cloneObj } else { return source } }