javascript - maps & weakmaps
Transcription
javascript - maps & weakmaps
Pour Débutants JAVASCRIPT (Programmation Internet) VOL. XXII J.B. Dadet DIASOLUKA Luyalu Nzoyifuanga +243 - 851278216 - 899508675 - 995624714 - 902263541 - 813572818 [email protected] LES « Maps » && « WeakMaps » : Les « Maps » sont des « Arrays » presque comme des « Associative Arrays », leurs données sont regroupées dans des couples « key : value ». Deux différences c’est que 1. Dans les « Maps » les couples « key : value » sont regroupés dans des Arrays à seulement ces deux éléments, ces couples étant séparés entre eux par une virgule ; 2. Le tout est délimité/regroupé dans une grande array le « Map » délimitée par des crochets au lieu des accolades contrairement aux « Associatives Arrays ». <script type="text/javascript"> "use strict"; var map = new Map([ ['a', 20], [Date.now(), 54], [45, Date.now()], [18, 'c'] ]); console.log(map); // Map(4) { // a -> 20, 1544283193937 -> 54, // 45 -> 1544283193937, 18 -> "c" // } for(var el of map) console.log(el); var t=`${"Keys".padEnd(7," ")} = | `; for(var cle of map.keys()) t += cle + ` | `; console.log(t); J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII var t=`${"Values".padEnd(7," ")} = * `; for(var val of map.values()) t += val + ` * `; console.log(t); </script> Maps && WeakMaps - 2/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII Quelques méthodes de l’objet « Map ( ) » : <script type="text/javascript"> "use strict"; var a = [Date.now()]; console.log(a); // Array [ 1544273035052 ] var map = new Map([['a', 20], [18, 35], [91, 54]]); console.log(map); // Firefox : Map { a -> 20, 18 -> 35, 91 -> 54 } // Yandex : Map(2) {"a" => 20, 18, 91 -> 54 => 35} map.set(a, 64).set(true, 85); console.log(map); // Map(4) { a -> 20, 18 -> 35, 91 -> 54, (1) […] -> 64, true -> 85 } Maps && WeakMaps - 3/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII // Map(4) {"a" => 20, 18 => 35, 91 -> 54, Array(1) => 64, true => 85} console.log(map.size); console.log(map.has(a)); console.log(map.has([1])); console.log(map.get(a)); console.log(map.get(18)); console.log(map.get(true)); // // // // // // => => => => => => 5 true false 64 35 85 let k="+ ", v="* "; map.forEach(function (val, key) { v+=val + ` * `; k+=key + ` + `; }); console.log(k); // => + a + 18 + 91 + 1544274283091 + true + console.log(v); // => * 20 * 35 * 54 * 64 * 85 * map.delete(a); console.log(map.size); // => 4 console.log(map.get(a)); // => undefined console.log(Array.from(map)); // Firefox : // => Array(4) [ (2) […], (2) […], (2) […], (2) […] ] // (4) […] // 0: Array [ "a", 20 ] // 1: Array [ 18, 35 ] // 2: Array [ 91, 54 ] // 3: Array [ true, 85 ] // length: 4 // <prototype>: Array [] // // Yandex : // => (4) (4) [Array(2), Array(2), Array(2), Array(2)] // 0: (2) ["a", 20] // 1: (2) [18, 35] // 2: (2) [91, 54] // 3: (2) [true, 85] // length: 4 // __proto__: Array(0) var map = new Map([ Maps && WeakMaps - 4/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII ['a', 56], [Date.now(), 40], [78, 'c'], [41, Date.now()] ]); console.log(map); // Map(4) { a -> 56, 1544277041459 -> 40, // 78 -> "c", 41 -> 1544277041459 } let kya=[], vla=[]; for (var [cle, valeur] of map) { kya=kya.concat(cle); vla.push(valeur); } console.log(kya); // Array(4) [ "a", 1544277173449, 78, 41 ] console.log(vla); // Array(4) [ 56, 40, "c", 1544277173449 ] let vl = []; for (let valeurs of map.values()){ vl=vl.concat(valeurs); } console.log(vl); // Array(4) [ 56, 40, "c", 1544277643496 ] let ky = []; for (var cles of map.keys()){ ky.push(cles); } console.log(ky); // => Array(4) [ "a", 1544277741029, 78, 41 ] </script> Lisez les commentaires dans le code ci-dessous : <script type="text/javascript"> "use strict"; var a = [Date.now()]; console.log(a); // Array [ 1544273035052 ] var map = new Map([['a', 20], [18, 35], [91, 54]]); console.log(map); // Firefox : Map { a -> 20, 18 -> 35, 91 -> 54 } // Yandex : Map(2) {"a" => 20, 18, 91 -> 54 => 35} Maps && WeakMaps - 5/27 jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII map.set(a, 64).set(true, 85); console.log(map); // Map(4) { a -> 20, 18 -> 35, 91 -> 54, (1) […] -> 64, true -> 85 } // Map(4) {"a" => 20, 18 => 35, 91 -> 54, Array(1) => 64, true => 85} console.log(map.size); console.log(map.has(a)); console.log(map.has([1])); console.log(map.get(a)); console.log(map.get(18)); console.log(map.get(true)); // // // // // // => => => => => => 5 true false 64 35 85 let k="+ ", v="* "; map.forEach(function (val, key) { v+=val + ` * `; k+=key + ` + `; }); console.log(k); // => + a + 18 + 91 + 1544274283091 + true + console.log(v); // => * 20 * 35 * 54 * 64 * 85 * map.delete(a); console.log(map.size); // => 4 console.log(map.get(a)); // => undefined console.log(Array.from(map)); // Firefox : // => Array(4) [ (2) […], (2) […], (2) […], (2) […] ] // (4) […] // 0: Array [ "a", 20 ] // 1: Array [ 18, 35 ] // 2: Array [ 91, 54 ] // 3: Array [ true, 85 ] // length: 4 // <prototype>: Array [] // // Yandex : // => (4) (4) [Array(2), Array(2), Array(2), Array(2)] // 0: (2) ["a", 20] // 1: (2) [18, 35] // 2: (2) [91, 54] Maps && WeakMaps - 6/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu // 3: (2) [true, 85] // length: 4 // __proto__: Array(0) JavaScript Tome-XXII var map = new Map([ ['a', 56], [Date.now(), 40], [78, 'c'], [41, Date.now()] ]); console.log(map); // Map(4) { a -> 56, 1544277041459 -> 40, // 78 -> "c", 41 -> 1544277041459 } let kya=[], vla=[]; for (var [cle, valeur] of map) { kya=kya.concat(cle); vla.push(valeur); } console.log(kya); // Array(4) [ "a", 1544277173449, 78, 41 ] console.log(vla); // Array(4) [ 56, 40, "c", 1544277173449 ] let vl = []; for (let valeurs of map.values()){ vl=vl.concat(valeurs); } console.log(vl); // Array(4) [ 56, 40, "c", 1544277643496 ] let ky = []; for (var cles of map.keys()){ ky.push(cles); } console.log(ky); // => Array(4) [ "a", 1544277741029, 78, 41 ] </script> Maps && WeakMaps - 7/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII Les « WeakMap » : Lisez les commentaires : <script type="text/javascript"> "use strict"; var a = [96, 10] , b = [43,[67, 84]] , c = [96, 42, 64]; var wmap = new WeakMap([[a, 1], [b, 2]]); console.log(wmap); // WeakMap { (2) […] -> 2, (2) […] -> 1 } // <entries>? // 0: Array [ … ] ? 2 // <key>: Array [ … ] // <key>: (2) […] // 0: 96 // 1: 10 // length: 2 // <prototype>: Array [] // <value>: 2 // 1: Array [ … ] ? 1 // <key>: Array [ … ] // <key>: (2) […] // 0: 43 // 1: Array [ 67, 84 ] // 1: (2) […] // 0: 67 // 1: 84 // length: 2 // <prototype>: Array [] // length: 2 // <prototype>: Array [] // <value>: 2 // <prototype>: Object { … } wmap.set(c, 3).set(b, 4); console.log(wmap); // WeakMap(3) { (2) […] -> 1, (2) […] -> 4, (3) […] -> 3 } // WeakMap(3) // <entries> // 0: Array [ … ] -> 1 // 0: (2) […] ? 1 // <key>: Array [ … ] Maps && WeakMaps - 8/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu // <key>: (2) […] // 0: 96 // 1: 10 // length: 2 // <prototype>: Array [] // <value>: 1 // 1: Array [ … ] -> 4 // 1: (2) […] -> 4 // <key>: Array [ … ] // <key>: (2) […] // 0: 43 // 1: Array [ 67, 84 ] // length: 2 // <prototype>: Array [] // <value>: 4 // 2: Array(3) [ … ] -> 3 // 2: (3) […] -> 3 // <key>: Array(3) [ … ] // <key>: (3) […] // 0: 96 // 1: 42 // 2: 64 // length: 3 // <prototype>: Array [] // <value>: 3 // <prototype>: Object { … } JavaScript Tome-XXII console.log("wmap.has([96, 42, 64]) = ", wmap.has([96, 42, 64])); // => false console.log(wmap.has(c)); // => true console.log(wmap.get(a)); console.log(wmap.get(b)); console.log(wmap.get(c)); // => 1 // => 4 // => 3 wmap.delete(b); console.log(wmap.get(b)); </script> // => undefined Le « get » et le « set » avec les « weakMap » : <script type="text/javascript"> "use strict"; var Oeil = (function () { Maps && WeakMaps - 9/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu console.log("Dans « Oeil »"); var organes = new WeakMap; JavaScript Tome-XXII console.log("this = ",this); // this = undefined function Oeil(lequel) { organes.set(this, lequel); console.log("this = ",this); // this = Object { } // this = Oeil {} } Oeil.prototype.dispOrgan = function () { return organes.get(this); }; Oeil.prototype.dispOrganPlus = function () { return [organes.get(this)," Surchargé"]; }; return Oeil; })(); console.log("Départ ..."); // Départ ... var bruch = new Oeil('Membane de Bruch'); // Dans « Oeil » console.log("Après « Oeil »"); // Après « Oeil » console.log(bruch); // Object { } // Oeil {} console.log(bruch.dispOrgan()); // Membane de Bruch console.log(bruch.dispOrganPlus()[0] , bruch.dispOrganPlus()[1]); // Membane de Bruch Surchargé for (var idx in bruch) console.log("* for (var idx in bruch) => ",idx); // * for (var idx in bruch) => dispOrgan Maps && WeakMaps - 10/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu // * for (var idx in bruch) => </script> Maps && WeakMaps - 11/27 - JavaScript Tome-XXII dispOrganPlus jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu Maps && WeakMaps JavaScript Tome-XXII - 12/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII Ne confondez pas la méthode « Array . map » (qui permet d’appliquer un même traitement à chaque membre d’une array) et l’objet Map (capitalisé) qui permet de créer un objet HashTable ou Dictionary. Ce HashTable est comme un objet ordinaire avec des clés et des valeurs associées, sauf qu’un Map peut utiliser comme clé n’importe quoi sauf les mots clés (numérique, string ou objet), alors que les autres objets n’admettent que des strings comme clés. Pour accéder aux clés Map utilise les méthodes « get » et « set »., alors que les objets utilisent le point séparateur (« objet . clé »). La clé d’un Map doit être soit un nombre (entre guillemets ou pas : les deux sont distincts), soit une chaîne représenté un objet déjà défini, ou alors une chaîne littérale (entre guillemets). <script type="text/javascript"> "use strict"; let y = new Map(); // objet Map y.set(2018, 'val de 2018'); y.set("25", 'val de 25'); y.set("z", 'val de "z"'); let x = new Map(); // objet Map let objectKey = { key: 'keyvalue' }; // litt d'objet. console.log(objectKey); // Object { key: "key-value" } console.log(objectKey.key); // keyvalue console.log(x.get(objectKey)); // undefined x.set(1, 'clé numérique'); console.log(x.get(1)); // clé numérique Maps && WeakMaps - 13/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII x.set('1', 'clé string'); console.log(x.get('1')); // clé string x.set('objk', objectKey); console.log(x.get('objk')); // Object { key: "keyvalue" } x.set(objectKey, ['une', 'Array', 'comme', 'val-eur']); console.log(x.get(objectKey)); // (4) ["une", "Array", "comme", "valeur"] console.log(objectKey.key); // keyvalue let fv=function(){this.pr="Property"}; x.set(fv, 'objet expression de fonction'); console.log(x.get(fv)); // objet expression de fonction console.log(y); // Map(3) { // 2018 => "val de 2018", // "25" => "val de 25", // "z" => "val de "z"" // } x.set(y, 'Et même un autre objet Map'); console.log(x.get(y)); // Et même un autre objet Map // L'objet Map clé ici n'altère pas // l'objet Map de départ. console.log(y); // Map(3) { // 2018 => "val de 2018", // "25" => "val de 25", // "z" => "val de "z"" // } // L'objet Map de départ n'a pas été altéré. console.log(x); // Map(6) { // 1 => "clé numérique", // "1" => "clé string", // "objk" => {…}, Maps && WeakMaps - 14/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII // {…} => Array(4), // ƒ => "objet expression de fonction", // … // } </script> Maps && WeakMaps - 15/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII Création d’objet Map avec des itérables (array d’arrays ou un généMaps && WeakMaps - 16/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII rateur) : new Map ( iterable : Object ). <script type="text/javascript"> "use strict"; var obj_key = { prop: 'property' }; var fromArray = new Map( [[0, 'array0'], [obj_key, 'array1']] ); // Initialisation de fromArray // (nouvel objet Map) // avec une itération d'arrays. console.log(fromArray.get(0)); // array0 console.log(fromArray.get(obj_key)); // array1 console.log(); // Gnération d'entrées de Map // avec une fonction génératrice. var generator_fct = function*() { yield [15, 'g15']; yield [obj_key, 'gObK']; }; // Initialisation de fromGenerator // (nouvel objet Map) // avec les entrées générées par un générateur. var fromGenerator = new Map(generator_fct()); // Affichage des entrées de fromGenerator. console.log(fromGenerator.get(15)); // g15 console.log(fromGenerator.get(obj_key)); // gObK console.log(fromGenerator.size); // 2 fromGenerator.set('add', 'value of add'); console.log(fromGenerator.size); // 3 fromGenerator.delete(15); // Retire console.log(fromGenerator); // Map(2) {{…} => "gObK", "add" => "value of add"} fromGenerator.clear(); // Efface tout console.log(fromGenerator); // Map { } </script> Maps && WeakMaps - 17/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu Maps && WeakMaps JavaScript Tome-XXII - 18/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII Parcourons quelques propriétés de Map : fromGenerator.hasOwnProperty() : false fromGenerator.valueOf() : Map { 15 -> "g15", {…} -> "gObK" } fromGenerator.toString() : [object Map]" fromGenerator.toSource() : "({})" fromGenerator.size : 2 fromArray.has(0) : true fromGenerator.has(15) : true fromGenerator.has(150) : false Le prototype de Map : Maps && WeakMaps - 19/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII Map() length: 0 name: "Map" prototype: {…} clear: function clear() constructor: function Map() delete: function delete() entries: function entries() forEach: function forEach() get: function get() has: function has() keys: function keys() set: function set() size: Getter values: function values() Symbol(Symbol.iterator): undefined Symbol(Symbol.toStringTag): undefined __proto__: Object { … } Symbol(Symbol.species): undefined __proto__: function () Map . entries ( ) : <script type="text/javascript"> "use strict"; var iMap = new Map( [ [1, 'valueof 1'], ['s', 'valueof s'], ['9', 'valueof 9'] ]); // BOUCLE FOR(...OF...) : Les entrées sont // returnées par iMap[Symbol.iterator] for (var value of iMap) { console.log(value); } // Array [ 1, "valueof 1" ] // Array [ "s", "valueof s" ] // Array [ "9", "valueof 9" ] // ITÉRATION EXPLICITE à travers les entrées for (var value of iMap.values()) { Maps && WeakMaps - 20/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu console.log(value); } // valueof 1 // valueof s // valueof 9 JavaScript Tome-XXII for (var entry of iMap.entries()) { console.log(entry); } // Array [ 1, "valueof 1" ] // Array [ "s", "valueof s" ] // Array [ "9", "valueof 9" ] // PARCOURS MANUEL DE L'ITÉRATEUR var entries = iMap.entries(); console.dir(entries.next()); console.dir(entries.next()); console.dir(entries.next()); console.dir(entries.next()); /* Object done: false value: (2) [1, "valueof 1"] Object done: false value: (2) ["s", "valueof s" Object done: false value: (2) ["9", "valueof 9"] Object done: true value: undefined */ // ITÉRATION AVEC FOREACH iMap.forEach(function(val, cle, obj) { console.log( 'clé: "' + cle + '", val: "' + val + '" '+obj); }); // clé: "1", val: "valueof 1" [object Map] // clé: "s", val: "valueof s" [object Map] // clé: "9", val: "valueof 9" [object Map] Maps && WeakMaps - 21/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII // FOR (...OF...) pour parcourir l'itérateur for(var cle of iMap.keys()) { console.log(cle); } // 1 // s // 9 for(var val of iMap.values()) { console.log(val); } // valueof 1 // valueof s // valueof 9 // UN AUTRE ACCÈS MANUEL À L'ITÉRATEUR var cles = iMap.keys(); console.log(cles.next()); console.log(cles.next()); console.log(cles.next()); console.log(cles.next()); // Object { value: 1, done: false } // Object { value: "s", done: false } // Object { value: "9", done: false } // Object { value: undefined, done: true } var vals = iMap.values(); console.log(vals.next()); console.log(vals.next()); console.log(vals.next()); console.log(vals.next()); // Object { value: "valueof 1", done: false } // Object { value: "valueof s", done: false } // Object { value: "valueof 9", done: false } // Object { value: undefined, done: true } </script> I. Remplacer des membres d’Array par d’autres : <script type = "text/javascript"> "use strict"; // Remplacez tous les "Louis" par "Rose" et "Blue". function suppress(parr, val) { var i; Maps && WeakMaps - 22/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII while ((i = parr.indexOf(val)) != -1) { parr.splice(i, 1,"*ROSE*","*MAGENTA*"); } return parr; } let arr=["Louis", "Delon", "Keriy", "Louis"] let narr=suppress(arr, "Louis") console.log(narr); </script> Maxthon v5.2.6.1000 et Opera Version 57.0.3098.106 : Firefox 64.0b13 : Maps && WeakMaps - 23/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII Yandex Version 18.11.1.385 beta : Kinshasa, le jeudi, 4. avril 2019 (10:47 ). Maps && WeakMaps - 24/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII Mots-clés : Maps, Arrays typées, ArrayBuffer, WeakMap, Typed Array, Array, key, value, JavaScript, EcmaScript, Associatives Arrays, Get, Set DIASOLUKA Nz. Luyalu Docteur en Médecine, Chirurgie & Accouchements (1977), CNOM : 0866 - Spécialiste en ophtalmologie (1980) Études humanités : Scientifique - Mathématiques & Physique. Informaticien-amateur, Programmeur et WebMaster. Chercheur indépendant, autonome et autofinancé, bénévole, sans aucun conflit d’intérêt ou liens d'intérêts ou contrainte promotionnelle avec qui qu’il soit ou quelqu’organisme ou institution / organisation que ce soit, étatique, paraétatique ou privé, industriel ou commercial en relation avec le sujet présenté. +243 - 851278216 - 899508675 - 991239212 - 902263541 - 813572818 [email protected] Autre Lecture : https://www.scribd.com/document/374738470/Le-Plus-Grand-Secret-de-LaCreation D’autres publications pouvant aussi intéresser : Maps && WeakMaps - 25/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII • https://www.scribd.com/document/377036251/Le-DosageDes-Medicaments-en-Cac-Cas • https://www.scribd.com/document/377035454/Le-HasardDes-Thermometres-Non-contact-a-Infrarouge • https://www.scribd.com/document/376222482/PetiteIntroduction-Aux-Fonctions-JavaScript • https://www.scribd.com/document/376221919/La-Foi-enJesus-Christ-Pour-Quoi-Faire • https://www.scribd.com/document/375689778/Lacuitevisuelle-angulaire • https://www.scribd.com/document/375349851/La-variableThis • https://www.scribd.com/document/375024162/FonctionsImbriquees-en-JS • https://www.scribd.com/document/374789297/FormatInterne-Des-Objets-JavaScript • https://www.scribd.com/document/374788758/Iterations-enJavaScript • https://www.scribd.com/document/374738470/Le-PlusGrand-Secret-de-La-Creation • https://www.scribd.com/document/374597969/NouvelleFormule-d-IMC-indice-de-doduite-Selon-Dr-Diasoluka • https://www.scribd.com/document/373847209/PropertyDescriptors • https://www.scribd.com/document/373833282/l-ObjetGlobal-Window • https://www.scribd.com/document/372665249/JavascriptTome-II • https://www.scribd.com/document/355291488/motiliteoculaire-2 • https://www.scribd.com/document/355291239/motiliteMaps && WeakMaps - 26/27 - jeudi, 4. avril 2019 (10:47 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-XXII oculaire-I • https://www.scribd.com/document/355290248/Script-dAnalyses-Des-Reflexes-Pupillomoteurs • https://www.scribd.com/document/321168468/Renseignement s-Id-et-Anthropometriques • https://www.scribd.com/document/320856721/Emission-31Jul-2016 • https://www.scribd.com/document/318182982/ComplicationVisuelle-du-Traitement-de-La-Malaria • https://www.scribd.com/document/318180637/RapportEntre-Oxymetrie-Et-Type-Respiration • https://www.scribd.com/document/315746265/ClassificationDes-Medicaments • https://www.scribd.com/document/315745909/IncongruencesHeresies-et-Heterodoxies-de-la-Notion-de-Laboratoire • https://www.scribd.com/document/315745725/RapportEntre-Oxymetrie-Et-Type-Respiration Maps && WeakMaps - 27/27 - jeudi, 4. avril 2019 (10:47 )