object

来源:8-23 手写JS深拷贝-考虑各种数据类型和循环引用

慕UI7606399

2022-03-22

老师,我试了一下不在声明 result 的时候赋默认值为空对象,在下方判断传入参数为对象是再赋值,就会死循环,这是为什么呢?

export function cloneDeep (obj: any, map = new WeakMap()):any {
    if (typeof obj !== 'object' || obj == null) return obj

    if (map.get(obj)) {
        return map.get(obj)
    }

    let result: any // 暂不赋值,在下方判断是 obj 为对象后再赋值
    map.set(obj, result)


    if (obj instanceof Map) {
        result = new Map()
        obj.forEach((v, k) => {
            const key = cloneDeep(k, map)
            const value = cloneDeep(v, map)
            result.set(key, value)
        })
    }

    if (obj instanceof Set) {
        result = new Set()
        obj.forEach(v => {
            const value = cloneDeep(v, map)
            result.add(value)
        })
    }

    if (obj instanceof Array) {
        result = []
        result = obj.map(item => cloneDeep(item, map))
    }

    if (Object.prototype.toString.call(obj) === '[object Object]') {
        result = {} // 这里赋值
        for (const key in obj) {
            const val = obj[key]
            const val1 = cloneDeep(val, map)
            result[key] = val1
        }
    }

    return result
}

其他的代码都没变

写回答

2回答

双越

2022-03-22

因为这里:

//img.mukewang.com/szimg/623917d40998560713360198.jpg

result 没有赋值,那你在 map 中设置的就是 undefined 。到时候判断循环引用,map 的数据就没有价值了

0
0

sanyeof

2022-04-08

weakmap设置target后,对map 等的循环引用的拷贝会出问题,深拷贝不到循环引用的map,可以在确定 target 类型后再设置 weakmap

0
0

2周刷完100道前端优质面试真题 双越最新力作

『前端面试真题100道』视频详解

1509 学习 · 642 问题

查看课程