手写 js 深浅拷贝

浅拷贝

  • 拷贝 目标对象的属性 引用类型地址
实现浅拷贝的方式
  1. Object.assign({}, .obj)
  2. 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
}

深拷贝

  • 拷贝 目标对象的属性
深拷贝实现方式
  1. JSON.parse(JSON.stringify())
  2. 通过深度循环递归来实现
    • 第一种 方式 虽说满足大部分的需求 但是有缺陷
      • 会忽略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)
	}
}

/**
 * 1. 判断是否 引用类型 不是 直接返回 
 * 2. 处理数组
 * 3. 处理循环引用
 * 4. 性能优化
*/
function deepClone(target, map = new Map()) {
    
    // 1. 判断是否 引用类型 不是 直接返回 
    if (!isObject(target)) {
        return target
    }

    // 2. 处理数组
    let cloneTarget = Array.isArray(target) ? [] : {}

    // 3. 处理循环引用
    if(map.get(target)) {
        return map.get(target)
    }
    map.set(cloneTarget, target)

    // 4. 性能优化
    // 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
}
  • 以上还有缺陷
  1. 不能拷贝 map set
  2. 不能拷贝 函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值