请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

// 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, 后面的值就变了,有点不太理解

正在回答 回答被采纳积分+3

2回答

提问者 我爱study 2022-04-11 09:13:40

第17行断点

//img1.sycdn.imooc.com//szimg/6253806a09589c9629020646.jpg

第19行断点

https://img1.sycdn.imooc.com//szimg/6253834509ebb27229100840.jpg

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

0 回复 有任何疑惑可以回复我~
  • 双越 #1
    代码我详细看了一遍,也 debug 了好几遍,确实如你所说。但我目前也没找到原因,我再继续跟踪改一下吧,有结果了我回复你。你也继续往下学吧,别卡在这一个问题上。
    回复 有任何疑惑可以回复我~ 2022-04-12 09:22:56
  • 提问者 我爱study 回复 双越 #2
    好的,谢谢老师
    回复 有任何疑惑可以回复我~ 2022-04-12 19:40:45
双越 2022-04-11 08:50:02

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 我爱study #1
    不一致,前面一个是0, 后面一个是1,但是不知道v1是引用了谁?
    还希望老师可以解惑
    回复 有任何疑惑可以回复我~ 2022-04-11 09:08:57
  • 提问者 我爱study #2
    主要是不明白为什么在target.set之后v1的值就变了
    回复 有任何疑惑可以回复我~ 2022-04-11 09:25:47
  • Charles_So_网页开发 回复 提问者 我爱study #3
    前面是0的时候,断点可以打印出 v1 === target 为 true,v1就是刚新建的空Map,size也是0。set完之后,循环引用 map 已经创建好 【 a.set('y', a) 】,所以输出 输出Map(1) {‘y’ => Map(1)}。
    
    循环引用有点坑,比较绕,你在 debugger 的时候,watch一下这3个值,应该就能找出规律了
    1. v1 === target 
    2. v1
    3. target
    回复 有任何疑惑可以回复我~ 2022-04-17 23:21:47
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信