Les générateurs en JavaScript sont un type spécial de fonction qui peut être interrompu et reprendre pendant leur exécution. Ils sont définis à l'aide de la syntaxe function*
et utilisent le mot clé yield
pour faire une pause et retourner les valeurs. L'utilisation principale des générateurs est de créer des itérateurs, qui sont des objets qui représentent une séquence de valeurs et permettent de traverser cette séquence en utilisant la méthode next()
.
Pour créer un itérateur à l'aide d'un générateur, vous définissez une fonction de générateur qui utilise yield
pour produire une séquence de valeurs. Lorsqu'il est appelé, la fonction du générateur renvoie un objet Iterator. Chaque fois que la méthode next()
est appelée sur cet itérateur, la fonction du générateur reprend son exécution jusqu'à ce qu'elle atteigne l'instruction yield
suivante, renvoyant un objet avec deux propriétés: value
(la valeur cédée) et done
(un booléen indiquant si l'itérateur a fini de produire des valeurs).
Voici un exemple simple d'utilisation d'un générateur pour créer un itérateur:
<code class="javascript">function* simpleGenerator() { yield 1; yield 2; yield 3; } const iterator = simpleGenerator(); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: false } console.log(iterator.next()); // { value: undefined, done: true }</code>
Les générateurs offrent plusieurs avantages spécifiques lorsqu'ils sont utilisés pour créer des itérateurs en JavaScript:
yield
permet une expression plus naturelle de la logique itérative.for...of
la boucle, simplifiant la consommation de séquences itérables.La mise en œuvre d'un itérateur personnalisé à l'aide de générateurs JavaScript est utile dans divers scénarios pratiques. Voici un exemple de générateur utilisé pour itérer sur la séquence de Fibonacci:
<code class="javascript">function* fibonacciGenerator() { let a = 0, b = 1; while (true) { yield a; [a, b] = [b, ab]; } } const fibonacciIterator = fibonacciGenerator(); console.log(fibonacciIterator.next().value); // 0 console.log(fibonacciIterator.next().value); // 1 console.log(fibonacciIterator.next().value); // 1 console.log(fibonacciIterator.next().value); // 2 console.log(fibonacciIterator.next().value); // 3</code>
Un autre scénario pratique est d'itréter un grand ensemble de données avec une mémoire limitée, comme la lecture d'un grand fichier ligne par ligne:
<code class="javascript">function* fileLineGenerator(filePath) { const fs = require('fs'); const readline = require('readline'); const fileStream = fs.createReadStream(filePath); const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity }); for await (const line of rl) { yield line; } } const lineIterator = fileLineGenerator('largeFile.txt'); // Use the iterator to process lines one by one for (const line of lineIterator) { console.log(line); }</code>
La syntaxe et les caractéristiques clés des générateurs en JavaScript qui les rendent utiles pour la création de l'itérateur incluent:
Syntaxe :
function*
, indiquant que la fonction est un générateur.yield
est utilisé pour produire des valeurs. yield
pause l'exécution de la fonction et renvoie une valeur à l'appelant.Caractéristiques clés :
next()
, qui reprend le générateur jusqu'au prochain yield
.yield
et le reprendre avec next()
permet un contrôle à grain fin sur le flux du générateur.return
pour spécifier une valeur finale. Lorsqu'un générateur rencontre une instruction return
, il se done
sur true
et inclut la valeur renvoyée dans la propriété value
de l'objet résultat.async/await
pour gérer les opérations asynchrones dans un code d'aspect plus synchrone.Voici un exemple présentant ces fonctionnalités:
<code class="javascript">function* generatorExample() { try { yield 'First value'; yield 'Second value'; return 'Final value'; } catch (error) { console.error('Error caught in generator:', error); } } const iterator = generatorExample(); console.log(iterator.next()); // { value: 'First value', done: false } console.log(iterator.next()); // { value: 'Second value', done: false } console.log(iterator.next()); // { value: 'Final value', done: true } console.log(iterator.next()); // { value: undefined, done: true }</code>
Ces syntaxes et fonctionnalités font des générateurs un outil puissant pour créer et gérer les itérateurs en JavaScript.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!