今天的挑战题目涉及到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');
在这段代码中,我们将两个生成的对象 obj1
和 obj2
作为键,分别在 WeakMap
中存储了对应的值 'stored value1'
和 'stored value2'
。
接下来,我们尝试从生成器中获取剩余的对象,并从 WeakMap
中获取它们的值:
const result = [...gen].map(obj => weakMap.get(obj));
这行代码中的关键在于理解生成器的状态:
通过
gen.next()
获取了obj1
和obj2
后,生成器已经前进了两步,生成的对象被消耗掉了。使用
[...]
展开生成器时,生成器已经没有更多的值可供生成,因此展开后的数组是空的。
输出结果
由于在展开时生成器已经耗尽,没有生成任何新对象,因此 result
是一个空数组 []
。
console.log(result); // 输出 []
结束
这道题目展示了生成器函数与 WeakMap 的巧妙结合,以及它们在JavaScript中的实际应用。由于生成器函数在调用 next() 方法后会前进,生成的对象被消耗掉,当我们尝试使用展开运算符时,生成器已经耗尽,因此无法生成新的对象,导致 result 是一个空数组。理解生成器的状态管理和 WeakMap 的弱引用特性对于正确解答这道题目至关重要。你答对了吗?欢迎在评论区分享你的答案和见解!
每天一道面试题,帮助你提高编程技能,不断进步!记得关注哦!