浅拷贝
实现浅拷贝的方式
- Object.assign({}, .obj)
- Array.slice()
function clone(target) {
if(target === null ) {
return target
}
let cloneTarget = Array.isArray(target) ? [] : {}
for (const key in target) {
if (target.hasOwnProperty(key)) {
cloneTarget[key] = target[key]
}
}
return cloneTarget
}
深拷贝
深拷贝实现方式
- JSON.parse(JSON.stringify())
- 通过深度循环递归来实现
- 第一种 方式 虽说满足大部分的需求 但是有缺陷
- 会忽略undefined
- 会忽略sybmol
- 会忽略函数
- 不能处理循环调用
function isObject(params) {
let type = typeof params
return params !== null && (type === 'object' || type === 'function')
}
function forEach(params, fn) {
console.log('parmas', params);
let index = -1
while (++index < params.length) {
console.log(params);
let key = params[index]
fn(key)
}
}
function deepClone(target, map = new Map()) {
if (!isObject(target)) {
return target
}
let cloneTarget = Array.isArray(target) ? [] : {}
if(map.get(target)) {
return map.get(target)
}
map.set(cloneTarget, target)
let Keys = Array.isArray(target) ? undefined : Object.keys(target)
forEach(Keys || target, (key) => {
console.log(key);
cloneTarget[key] = deepClone(target[key], map)
})
return cloneTarget
}
- 不能拷贝 map set
- 不能拷贝 函数