面试题每日一练,测测你对JavaScript生成器和WeakMap的理解

54106030133c62fb5b294d640469946d.png

今天的挑战题目涉及到JavaScript中的 WeakMap 和生成器函数。这些技术在内存管理和惰性求值场景中非常有用。我们一起来分析这段代码,看看它会输出什么以及背后的逻辑。

首先,我们定义了一个 WeakMap 实例:

const weakMap = new WeakMap();

WeakMap 是一种特殊的 Map,它的键必须是对象,并且这些对象是弱引用,这意味着如果没有其他引用指向这些对象,它们可以被垃圾回收。

接着,我们定义了一个生成器函数,用来生成两个对象:

const gen = (function* () {
  yield { key: 'value1' };
  yield { key: 'value2' };
})();

生成器函数返回一个生成器对象 gen,每次调用 gen.next() 时,它会依次生成 { key: 'value1' }{ key: 'value2' } 这两个对象。

然后,我们使用 gen.next() 获取生成的对象,并将它们存储在 WeakMap 中:

const obj1 = gen.next().value;
const obj2 = gen.next().value;

weakMap.set(obj1, 'stored value1');
weakMap.set(obj2, 'stored value2');

在这段代码中,我们将两个生成的对象 obj1obj2 作为键,分别在 WeakMap 中存储了对应的值 'stored value1''stored value2'

接下来,我们尝试从生成器中获取剩余的对象,并从 WeakMap 中获取它们的值:

const result = [...gen].map(obj => weakMap.get(obj));

这行代码中的关键在于理解生成器的状态:

  1. 通过 gen.next() 获取了 obj1obj2 后,生成器已经前进了两步,生成的对象被消耗掉了。

  2. 使用 [...] 展开生成器时,生成器已经没有更多的值可供生成,因此展开后的数组是空的。

输出结果

由于在展开时生成器已经耗尽,没有生成任何新对象,因此 result 是一个空数组 []

console.log(result); // 输出 []

结束

这道题目展示了生成器函数与 WeakMap 的巧妙结合,以及它们在JavaScript中的实际应用。由于生成器函数在调用 next() 方法后会前进,生成的对象被消耗掉,当我们尝试使用展开运算符时,生成器已经耗尽,因此无法生成新的对象,导致 result 是一个空数组。理解生成器的状态管理和 WeakMap 的弱引用特性对于正确解答这道题目至关重要。你答对了吗?欢迎在评论区分享你的答案和见解!

每天一道面试题,帮助你提高编程技能,不断进步!记得关注哦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值