Académique Documents
Professionnel Documents
Culture Documents
E S 10 I t é r a t e u r s , G é n é r a t e u r s ,
& Itér ables
CHAPITRE 10 :
Les générateurs sont des fonctions qu'on peut quitter puis reprendre
(continuer). Le contexte d'un générateur (les liaisons avec ses va-
riables) est sauvegardé entre deux invocations. C’est donc aussi un bon
moyen d’utiliser des variables statiques dans JavaScript, en plus des
closures (fermetures, et curries [currying ou Curryfication]).
5. Chaque appel à la méthode .next() doit avoir un yield qui lui est
associé dans le générateur. Une façon facile de le garantir est
d’utiliser une boucle valide qui contient l’instruction yield. Pendant
qu’on est dans cette boucle yield renvoie une valeur valide, dès
qu’on quitte la boucle elle (yield) renvoie undefined, à moins de
prévoir des yield supplémentaire après et en dehors de cette
boucle.
6. Mais il n’est pas nécessaire (bien que souvent inutile) d’avoir plus
de yield dans le générateur que de .next() appelées.
8. Tout comme return, yield renvoie des valeurs de tout type, pas seu-
lement des booléennes, mais il (le yield) n’est pas non plus obligé
d’en renvoyer explicitement, par exemple quand le .next() qui
l’appelle utilise un ou des arguments.
10. Comme yield ne clôt pas la fonction mais seulement la suspend, les
variables locales de la fonction génératrice persistent donc après
cette suspension par yield.
11. La boucle « for…of » agit sur les « itérables », tandis que la boucle
« for…in » agit sur les « énumérables ».
const it = {
*[Symbol.iterator]() {
for(let k of m) {
if(k=="tartre") flagt++;
if(k=="crouzon") flagc++;
yield ++c+". "+k;
}
}
}
const it = {
*[Symbol.iterator]() {
for (let k of m) yield c+=2;
}
}
let cptr=0;
for (let v of combo)
t += (++cptr).toString().padStart(2,'.') + ") " +
v+' | ';
console.log(t);
</script>
let cptr=0;
for (let v of combo)
t += (++cptr).toString()
.padStart(2,String
let cptr=0;
for (let v of combo)
t += (++cptr).toString()
.padStart(2,String
.fromCharCode(183)) +
") " +
v+' | ';
console.log(t);
</script>
Déclaration de la fonction-générarice :
Exemple :
const it = fGenerator();
// Déf itérateur par appel au généateur
cl(it.next().value); // 9
cl(it.next().value); // 10
var it = numeroter();
console.log(it.next().value); // 0
console.log(it.next().value); // 1
console.log(it.next().value); // 2
Itération-Générateur-Yield-Next -10/44- vendredi, 21. décembre 2018 (9:57 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-VI
console.log(it.next().value); // 1er next Après la boucle
console.log(it.next().value); // undefined
console.log(it.next().value); // undefined
</script>
var it = numeroter();
console.log(it.next().value); // 0
console.log(it.next().value); // 10
console.log(it.next().value); // 20
console.log(it.next().value); // 30
console.log(it.next().value); // undefined
</script>
var it = numeroter();
console.log(it.next().value); // false
console.log(it.next().value); // true
console.log(it.next().value); // false
console.log(it.next().value); // true
Itérateur-Générateur-Itérables -11/44- vendredi, 21. décembre 2018 (9:57 )
console.log(it.next().value); // undefined
</script>
ard=[
"Conjonctivite",
"Myopie",
"Rétinoblastome",
"Perforation"
];
var it = numeroter();
console.log(it.next().value); // sécrétions
console.log(it.next().value); // lunettes
console.log(it.next().value); // masse
console.log(it.next().value); // herniation
console.log(it.next().value); // undefined
console.log(it.next().value); // undefined
</script>
var it = numeroter();
const diag = {
Conjonctivite:"sécrétions",
Myopie:"lunettes",
Rétinoblastome:"masse",
Perforation:"herniation"
};
let c;
c = it.next().value;
console.log(Object.entries(diag)[c][0],
Object.entries(diag)[c][1]);
// Conjonctivite sécrétions
c = it.next().value;
console.log(Object.entries(diag)[c][0],
Object.entries(diag)[c][1]);
// Myopie lunettes
c = it.next().value;
console.log(Object.entries(diag)[c][0],
Object.entries(diag)[c][1]);
// Rétinoblastome masse
c = it.next().value;
console.log(Object.entries(diag)[c][0],
Object.entries(diag)[c][1]);
// TypeError:
Itérateur-Générateur-Itérables -13/44- vendredi, 21. décembre 2018 (9:57 )
// Object.entries(...)[c] is undefined;
// can't access element at index 0
</script>
console.log(r);
// Object {
// value: "Valeur retournée par yield",
// done: false
// }
//
//
// {…}
// done: false
// value: "Valeur retournée par yield"
// <prototype>: Object { … }
</script>
Itération-Générateur-Yield-Next -14/44- vendredi, 21. décembre 2018 (9:57 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-VI
console.log(Object.getOwnPropertyDescriptors(r))
console.log(Object.getOwnPropertyNames(r))
ard=[
"Conjonctivite",
"Myopie",
"Rétinoblastome",
"Perforation"
];
let r;
r=gen.next();
console.log(r.value + " " + r.done); // sécrétions false
r=gen.next();
console.log(r.value + " " + r.done); // lunettes false
r=gen.next();
console.log(r.value + " " + r.done); // masse false
r=gen.next();
console.log(r.value + " " + r.done); // herniation false
r=gen.next();
console.log(r.value + " " + r.done); // undefined false
r=gen.next();
Itération-Générateur-Yield-Next -18/44- vendredi, 21. décembre 2018 (9:57 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-VI
console.log(r.value + " " + r.done); // undefined false
</script>
1er exemple :
2e exemple :
let r;
r=gen.next();
console.log(r.value+" "+r.done); // 0 false
r=gen.next();
console.log(r.value+" "+r.done); // 1 false
r=gen.next();
console.log(r.value+" "+r.done); // 2 false
r=gen.next();
console.log(r.value+" "+r.done);
// 1er next Après la boucle
// undefined
r=gen.next();
console.log(r.value+" "+r.done); // undefined true
r=gen.next();
console.log(r.value+" "+r.done); // undefined true
// 0 false test.html:21:1
// 1 false test.html:23:1
// 2 false test.html:25:1
// 1er next Après la boucle test.html:10:3
// undefined true test.html:27:1
// undefined true test.html:29:1
// undefined true test.html:31:1
</script>
ard=[
"Conjonctivite",
"Myopie",
"Rétinoblastome",
"Perforation"
];
let r;
r=gen.next();
console.log(r.value + " " + r.done); // sécrétions false
r=gen.next();
console.log(r.value + " " + r.done); // lunettes false
r=gen.next();
console.log(r.value + " " + r.done); // masse false
r=gen.next();
console.log(r.value + " " + r.done); // undefined true
r=gen.next();
console.log(r.value + " " + r.done); // undefined true
r=gen.next();
console.log(r.value + " " + r.done); // undefined true
console.log("Exécution du 2e yield")
yield g;
console.log("Exécution du 3e yield")
yield g + v;
console.log("Exécution du 4e yield")
yield p + v;
console.log("Exécution du 5e yield")
yield g * p + v;
}
v = 15;
console.log(gen.next().value); // 5
v = 25;
console.log(gen.next().value); // 30
v = 30;
console.log(gen.next().value); // 40
v = 40;
console.log(gen.next().value); // 90
console.log(gen.next().done) // true
// RÉSULTATS
// true test.html:38:3
</script>
Exécution :
console.log("^^^^^^^",yield "Initio");
// Exécute d'abord yield (donc rentre vers le next appe-
lant),
// et donc interrompt et quitte le générateur sans le
fermer,
// et donc le console.log() ci-dessus
// sera exécuté seulement au prochain .next(), mais
// pas avec la valeur en cours de yield ("Initio"), mais
// ave l'argument éventuel du .next() suivant ("2. Ke-
liol...").
// Voir l'ordre d'exécution dans l'affichage de la con-
sole.
r=gen.next();
Itérateur-Générateur-Itérables -25/44- vendredi, 21. décembre 2018 (9:57 )
console.log("=>",r,r.value,r.done," <=");
console.log(yield);
pour afficher :
pour afficher :
return 45;
qui affiche :
Avec yield* (yield avec astérisque) la génération des valeurs est délé-
guée à une autre fonction génératrice.
function* gen(i){
yield i; // Retourne 15 pour *A* seulement
yield* autreGen(i);
// délègue à yield* pour *B*, *C* et *D*
// (puisque 3 yield ds autreGen),
// avec i=15 (argument de yield*)
yield i * 6;
// Suite des yield dans gen, donc retourne 15*6 pour *E*
yield i * 7;
// Retourne 15*7=105 pour *F*
}
r=gen.next();
console.log("A**gen ",r.value,r.done); // A**gen 15
false
r=gen.next();
console.log("B**gen ",r.value,r.done); // B**gen 30
false
r=gen.next();
console.log("C**gen ",r.value,r.done); // C**gen 45
false
r=gen.next();
console.log("D**gen ",r.value,r.done); // D**gen 60
false
r=gen.next();
console.log("E**gen ",r.value,r.done); // E**gen 90
false
r=gen.next();
console.log("F**gen ",r.value,r.done); // F**gen 105
false
Itérateur-Générateur-Itérables -31/44- vendredi, 21. décembre 2018 (9:57 )
r=gen.next();
console.log("F**gen ",r.value,r.done); // F**gen undefi-
ned true
// undefined : il n'y a plus de yield dans gen.
</script>
Application :
yield String(++n).padStart(2,'.')+
". pds=" + String(ech["p"]).padStart(3,' ')
+
" kg , taille=" +
String(ech["t"]).padStart(4,' ')+
" cm , imc=" + imc.toPrecision(4) + "
kg²/cm" ;
}
}
Exéccution :
Exécution :
1. 2 test.html:12:3
2. 4 test.html:12:3
3. 8 test.html:12:3
4. 16 test.html:12:3
5. 32 test.html:12:3
6. 64 test.html:12:3
7. 128 test.html:12:3
8. 256 test.html:12:3
9. 512 test.html:12:3
10. 1024 test.html:12:3
https://gist.github.com/kavitshah8/d8ba19d09334d8e08a1f209fdbacb597
/raw/d96f9bab8f5fbbf5b4d9227f48c73a6848525524/curry2.js
for(let k=0;k<=10;k++){
console.log(2,"^",k,"=", pow2x(k) )
}
console.log("")
var p=1;
for(let k=0;k<=10;k++){
var res=compound(pow2x)(k)
console.log(p,"^",2,"=", compound(pow2x)(k) )
// 2 ^ 0 = 1 test.html:12:23
// 2 ^ 1 = 2 test.html:12:23
// 2 ^ 2 = 4 test.html:12:23
// 2 ^ 3 = 8 test.html:12:23
// 2 ^ 4 = 16 test.html:12:23
// 2 ^ 5 = 32 test.html:12:23
// 2 ^ 6 = 64 test.html:12:23
// 2 ^ 7 = 128 test.html:12:23
// 2 ^ 8 = 256 test.html:12:23
// 2 ^ 9 = 512 test.html:12:23
// 2 ^ 10 = 1024 test.html:12:23
// 1 ^ 2 = 2 test.html:18:3
// 2 ^ 2 = 4 test.html:18:3
// 4 ^ 2 = 16 test.html:18:3
// 16 ^ 2 = 256 test.html:18:3
// 256 ^ 2 = 65536 test.html:18:3
// 65536 ^ 2 = 4294967296 test.html:18:3
// 4294967296 ^ 2 = 18446744073709552000
// 18446744073709552000 ^ 2 = 3.402823669209385e+38
// 3.402823669209385e+38 ^ 2 = 1.157920892373162e+77
// 1.157920892373162e+77 ^ 2 = 1.3407807929942597e+154
// 1.3407807929942597e+154 ^ 2 = Infinity
</script>
Et
for(let k=0;k<=10;k++){
Itérateur-Générateur-Itérables -35/44- vendredi, 21. décembre 2018 (9:57 )
console.log(2,"^",k," = ", pow2x(k) )
}
console.log("")
var p=1;
for(let k=0;k<=10;k++){
var res=compound(pow2x)(k)(2)
console.log(p,"^",2,"^",2,"=", compound(pow2x)(k)(2) )
p=Math.sqrt(res)
}
// 2 ^ 0 = 1
// 2 ^ 1 = 2
// 2 ^ 2 = 4
// 2 ^ 3 = 8
// 2 ^ 4 = 16
// 2 ^ 5 = 32
// 2 ^ 6 = 64
// 2 ^ 7 = 128
// 2 ^ 8 = 256
// 2 ^ 9 = 512
// 2 ^ 10 = 1024
// 1 ^ 2 ^ 2 = 4
// 2 ^ 2 ^ 2 = 16
// 4 ^ 2 ^ 2 = 256
// 16 ^ 2 ^ 2 = 65536
// 256 ^ 2 ^ 2 = 4294967296
// 65536 ^ 2 ^ 2 = 18446744073709552000
// 4294967296 ^ 2 ^ 2 = 3.402823669209385e+38
// 18446744073709552000 ^ 2 ^ 2 = 1.157920892373162e+77
// 3.402823669209385e+38 ^ 2 ^ 2 = 1.3407807929942597e+154
// 1.157920892373162e+77 ^ 2 ^ 2 = Infinity
// Infinity ^ 2 ^ 2 = Infinity
</script>
CHAPITRE 11 :
ITÉRATIONS D'ÉNUMÉRABLES :
Exemple d’itération :
const it = iterable[Symbol.iterator]();
let tot="";
while (true) {
const res = it.next();
if (res.done) { break; }
Exécution :
// ITÉRATIONS D'ÉNUMÉRABLES //
Ob-
ject.entries(obj).forEach(([cle,val])=>console.log(cle+"
<-> "+val));
// 1 <-> Un
// obj <-> [object Object]
// L <-> A
// deux <-> 2
// array <-> texte,9,[object Object]
// Object.entries(obj) . FOREACH(([CLE])
// object
//
console.log("---","***","---");
Object.entries(obj).forEach(([cle]) =>
console.log(cle));
// 1
Itérateur-Générateur-Itérables -39/44- vendredi, 21. décembre 2018 (9:57 )
// obj
// L
// deux
// array
// Object.entries(obj) . FOREACH(([VAL])
// object
//
console.log("---","***","---");
Object.entries(obj).forEach(([,val]) =>
console.log(val));
// Un
// Object { }
// A
// 2
// Array [ "texte", 9, {…} ]
// Object.VALUES(obj)
// object
//
console.log("---","***","---");
console.log(Object.values(obj));
// Array [ "Un", {}, "A", 2, […] ]
// Object.ENTRIES(obj.array) . FOREACH(([idx])
// array
//
console.log("---","***","---");
Object.entries(obj.array).forEach(([idx]) =>
console.log(idx+" -> "+obj.array[idx]));
// 0 -> texte
// 1 -> 9
// 2 -> [object Object]
// Object.values(obj.array)
// array
//
console.log("---","***","---");
Itérateur-Générateur-Itérables -41/44- vendredi, 21. décembre 2018 (9:57 )
console.log(Object.values(obj.array));
// Array [ "texte", 9, {…} ]
// FOR (var i IN s)
// String
//
console.log("---","***","---");
let s="Diasol";
for (var i in s) {
console.log(i+" -> "+s[i]);
}
// 0 -> D
// 1 -> i
// 2 -> a
// 3 -> s
// 4 -> o
// 5 -> l
// APPLICATIONS PRATIQUES
// HASOWNPROPERTY(prop)
//
console.log("---","***","---");
let triangle = {a: 1, b: 2, c: 3};
let epaisseur = {ep:"epais"};
function ColoredTriangle() {
this.color = 'red';
Itération-Générateur-Yield-Next -42/44- vendredi, 21. décembre 2018 (9:57 )
J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-VI
}
console.log("ColoredTriangle.aimepar =
"+ColoredTriangle.aimepar);
// ColoredTriangle.aimepar = 15
console.log("obj.aimepar = "+obj.aimepar);
// obj.aimepar = undefined
console.log("---","***","---");
console.log(Object.getOwnPropertyNames(obj));
// Array [ "color", "brillant" ]
if (obj.hasOwnProperty(prop)) {
console.log(`*** OWN PROP : obj.${prop} =
${obj[prop]}`);
}
// *** OWN PROP : obj.color = red
// *** OWN PROP : obj.brillant = true
}
console.log("---","***","---");
console.log(Object.getOwnPropertyNames(ColoredTriangle));
Itérateur-Générateur-Itérables -43/44- vendredi, 21. décembre 2018 (9:57 )
// Array [ "aimepar", "prototype", "length", "name" ]
console.log("---","***","---");
if (ColoredTriangle.hasOwnProperty(prop)) {
console.log(`*** OWN PROP : ColoredTriangle.${prop} =
${ColoredTriangle[prop]}`);
}
// *** OWN PROP : ColoredTriangle.aimepar = 15
}
</script>
Exécution :
4 -> o test.html:191:6
5 -> l test.html:191:6
--- *** --- test.html:205:3
ColoredTriangle.aimepar = 15 test.html:221:1
obj.aimepar = undefined test.html:224:1
===> ownProperties de l'INSTANCE test.html:227:1
--- *** --- test.html:230:3
Mots-clés :
diasfb@mail2world.com