面试题答案
一键面试yield关键字的功能
- 暂停和恢复执行:在生成器函数中,
yield
关键字用于暂停函数的执行,并返回紧跟其后的表达式的值。生成器函数是一种特殊的函数,调用它不会立即执行函数体,而是返回一个迭代器对象。当迭代器的next()
方法被调用时,生成器函数开始执行,直到遇到yield
关键字暂停。再次调用next()
方法,生成器函数会从暂停的位置继续执行,直到下一个yield
或者函数结束。 - 值的传递:
yield
不仅可以返回值给生成器函数的调用者,还可以通过next()
方法传递值进来。当调用next(value)
时,这个value
会成为暂停的yield
表达式的返回值。
性能优化示例
假设有一个场景,需要处理大量数据,每次处理一部分数据,而不是一次性加载和处理全部数据,以避免内存占用过高。
function* largeDataGenerator(dataArray) {
for (let i = 0; i < dataArray.length; i++) {
yield dataArray[i];
}
}
// 模拟大量数据
const largeData = Array.from({ length: 1000000 }, (_, i) => i + 1);
const generator = largeDataGenerator(largeData);
let value;
while (!(value = generator.next()).done) {
// 这里每次只处理一个数据,而不是一次性处理全部1000000个数据
console.log('处理数据:', value.value);
// 可以在这里执行复杂的计算等操作,不会因一次性处理大量数据导致内存溢出等性能问题
}
在上述代码中,使用生成器和yield
关键字,每次只从大数据数组中取出一个数据进行处理,避免一次性加载和处理大量数据,有效地优化了内存性能。如果直接使用普通循环一次性处理largeData
数组中的所有数据,可能会导致内存占用过高,特别是在数据量非常大的情况下。而生成器通过yield
逐块处理数据,大大降低了内存压力,提升了性能。