MST

星途 面试题库

面试题:JavaScript生成器中yield关键字的作用及在性能优化方面的体现

请详细阐述JavaScript生成器里yield关键字的功能,并举例说明它是如何对性能优化起到作用的。
37.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

yield关键字的功能

  1. 暂停和恢复执行:在生成器函数中,yield关键字用于暂停函数的执行,并返回紧跟其后的表达式的值。生成器函数是一种特殊的函数,调用它不会立即执行函数体,而是返回一个迭代器对象。当迭代器的next()方法被调用时,生成器函数开始执行,直到遇到yield关键字暂停。再次调用next()方法,生成器函数会从暂停的位置继续执行,直到下一个yield或者函数结束。
  2. 值的传递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逐块处理数据,大大降低了内存压力,提升了性能。