淺拷貝
拷貝 目標(biāo)對(duì)象的屬性 引用類型地址
實(shí)現(xiàn)淺拷貝的方式
Object.assign({}, .obj)
Array.slice()
// 淺拷貝簡(jiǎn)單實(shí)現(xiàn)
function clone(target) {
if(target === null ) {
return target
}
// 克隆 數(shù)組 和 對(duì)象
let cloneTarget = Array.isArray(target) ? [] : {}
for (const key in target) {
if (target.hasOwnProperty(key)) {
cloneTarget[key] = target[key]
}
}
return cloneTarget
}
深拷貝
拷貝 目標(biāo)對(duì)象的屬性
深拷貝實(shí)現(xiàn)方式
JSON.parse(JSON.stringify())
雖說(shuō)滿足大部分的需求 但是有缺陷
會(huì)忽略u(píng)ndefined
會(huì)忽略sybmol
會(huì)忽略函數(shù)
不能處理循環(huán)調(diào)用
通過(guò)深度循環(huán)遞歸來(lái)實(shí)現(xiàn)
// 手動(dòng)實(shí)現(xiàn) 深拷貝
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)
}
}
/**
* 1. 判斷是否 引用類型 不是 直接返回
* 2. 處理數(shù)組
* 3. 處理循環(huán)引用
* 4. 性能優(yōu)化
*/
function deepClone(target, map = new Map()) {
// 1. 判斷是否 引用類型 不是 直接返回
if (!isObject(target)) {
return target
}
// 2. 處理數(shù)組
let cloneTarget = Array.isArray(target) ? [] : {}
// 3. 處理循環(huán)引用
if(map.get(target)) {
return map.get(target)
}
map.set(cloneTarget, target)
// 4. 性能優(yōu)化
// for (const key in target) {
// if (target.hasOwnProperty(key)) {
// const element = target[key];
// cloneTarget[key] = deepClone(target[key], map)
// }
// }
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
不能拷貝 函數(shù)