不太理解在Map循环引用的时候,返回的值v1是怎么变化的?

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

我爱study

2022-04-10

// Map
if (obj instanceof Map) {
    target = new Map()
    map.set(obj, target) // 当这里是map的时候,set了个空的Map(视频里没有讲)
    obj.forEach((v, k) => {
        const v1 = cloneDeep(v, map)
        const k1 = cloneDeep(k, map)
        console.log(v1) // 前 输出 Map(0) {size: 0}
        target.set(k1, v1)
        console.log(v1) // 后 输出 Map(1) {'y' => Map(1)}
    })
}

....

// 用例代码
const a = new Map()
a.set('y', a)

当Map循环引用的时候,两处console.log(v1)的值不同
在前面的v1输出 Map(0) {size: 0}
在后面的v1输出Map(1) {‘y’ => Map(1)}
中间只差了个target.set, 后面的值就变了,有点不太理解

写回答

2回答

我爱study

提问者

2022-04-11

第17行断点

//img.mukewang.com/szimg/6253806a09589c9629020646.jpg

第19行断点

//img.mukewang.com/szimg/6253834509ebb27229100840.jpg

v1的值变化了,图片有点糊,但是大概看出来

0
2
我爱study
回复
双越
好的,谢谢老师
2022-04-12
共2条回复

双越

2022-04-11

Chrome 控制台输出引用类型,是不可信的,因为引用类型可能随时变化。

你可以两行都打印 v1.size (返回 number,值类型),看是否一致

0
5
我爱study
回复
Charles_So_网页开发
v1 === target ,target.set(k1, v1) 等于 target.set(k1, target),相当于set了他自己,这就循环引用上了
2022-04-23
共5条回复

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

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

1509 学习 · 642 问题

查看课程