Le type Number J AVA S C R I P T (Programmation Internet) V O L . I I I Pour Débuter J.B. Dadet DIASOLUKA Luyalu Nzoyifuanga +243 - 851278216 - 899508675 - 991239212 - 902263541 - 813572818 La dernière révision de ce texte est disponible sur CD. Le type « number » possède exactement 18’437’736’874’454’810’627 (264 - 253 + 3) valeurs double-précision 64-bit format IEEE 754-2008. Voici quelques constantes remarquables : <script> console.log("Number.EPSILON = " + Number.EPSILON); console.log("Number.MAX_VALUE = " + Number.MAX_VALUE); console.log("Number.MIN_VALUE = " + Number.MIN_VALUE); console.log("Number.MAX_SAFE_INTEGER = " , Number.MAX_SAFE_INTEGER); console.log("Number.MIN_SAFE_INTEGER = " , Number.MIN_SAFE_INTEGER); console.log("Number.NEGATIVE_INFINITY = " , Number.NEGATIVE_INFINITY); console.log("Number.NaN = " + Number.NaN); console.log("Number.POSITIVE_INFINITY = " , Number.POSITIVE_INFINITY); console.log("Number.isFinite = " , Number.isFinite); console.log("Number.isInteger = " , Number.isInteger); console.log("Number.isNaN = " , Number.isNaN); console.log("Number.isSafeInteger = " , Number.isSafeInteger); console.log("(2.5e-324)*1 =",(2.5e-324)*1); console.log("(2.4e-324)*1 =",(2.4e-324)*1); </script> Le type Number Number.EPSILON = 2.220446049250313e-16 Number.MAX_VALUE = 1.7976931348623157e+308 Number.MIN_VALUE = 5e-324 Number.MAX_SAFE_INTEGER = 9007199254740991 Number.MIN_SAFE_INTEGER = -9007199254740991 Number.NEGATIVE_INFINITY = -Infinity Number.NaN = NaN Number.POSITIVE_INFINITY = Infinity test.html:2:4 test.html:3:4 test.html:4:4 test.html:5:4 test.html:7:4 test.html:9:4 test.html:11:4 test.html:12:4 Number.isFinite = function isFinite() test.html:14:4 Number.isInteger = function isInteger() test.html:16:4 Number.isNaN = function isNaN() test.html:18:4 Number.isSafeInteger = function isSafeInteger() test.html:19:4 (2.5e-324)*1 = 5e-324 test.html:21:4 (2.4e-324)*1 = 0 test.html:22:4 On peut aussi obtenir ces résultats avec la commande « Object.getOwnPropertyDescriptors(Number) » qui donne ceci à la console du browser ou dans un code JS. Dans un code JavaScript : <script> console.log("Object.getOwnPropertyDescriptors(Number = " , Object.getOwnPropertyDescriptors(Number)); </script> À la console du browser : Object.getOwnPropertyDescriptors(Number) Object { prototype: {…}, NaN: {…}, POSITIVE_INFINITY: {…}, NEGATIVE_INFINITY: {…}, MAX_VALUE: {…}, MIN_VALUE: {…}, MAX_SAFE_INTEGER: {…}, MIN_SAFE_INTEGER: {…}, EPSILON: {…}, isFinite: {…}, … DIASOLUKA Nz. Luyalu 2 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number } Object.getOwnPropertyDescriptors(Number) {…} 1. {length: {…}, name: {…}, prototype: {…}, isFinite: {…}, isInteger: {…}, …} 1. EPSILON: { value: 2.220446049250313e-16, writable: false, enumerable: false, configurable: false} 2. MAX_SAFE_INTEGER: { value: 9007199254740991, writable: false, enumerable: false, configurable: false} 3. MAX_VALUE: { value: 1.7976931348623157e+308, writable: false, enumerable: false, configurable: false} 4. MIN_SAFE_INTEGER: { value: -9007199254740991, writable: false, enumerable: false, configurable: false} 5. MIN_VALUE: { value: 5e-324, writable: false, enumerable: false, configurable: false} 6. NEGATIVE_INFINITY: { value: -Infinity, writable: false, enumerable: false, configurable: false} 7. NaN: { value: NaN, writable: false, enumerable: false, configurable: false} 8. POSITIVE_INFINITY: { value: Infinity, writable: false, enumerable: false, configurable: false} 9. isFinite: { value: ƒ, writable: true, enumerable: false, configurable: true} 10. isInteger: { value: ƒ, writable: true, enumerable: false, configurable: true} 11. isNaN: { value: ƒ, writable: true, enumerable: false, configurable: true} DIASOLUKA Nz. Luyalu 3 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number 12. isSafeInteger: { value: ƒ, writable: true, enumerable: false, configurable: true} 13. length: { value: 1, writable: false, enumerable: false, configurable: true} 14. name: { value: "Number", writable: false, enumerable: false, configurable: true} 15. parseFloat: { value: ƒ, writable: true, enumerable: false, configurable: true} 16. parseInt: { value: ƒ, writable: true, enumerable: false, configurable: true} 17. prototype: { value: Number, writable: false, enumerable: false, configurable: false} 18. __proto__: Object DIASOLUKA Nz. Luyalu 4 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number I. Le NaN (Not a Number) : Quelques types de données sont très difficiles à se figurer : 1. null : valeur que souvent vous (rarement le système) affectez explicitement à une variable pour l’initialiser à RIEN, juste pour éviter qu’elle ait automatiquement la valeur undefined. 2. Undefined : Valeur que prend automatiquement une variable quand elle n’est pas explicitement initialisée (même pas avec null) lors de sa déclaration. 3. NaN (number value that is a IEEE 754 “Not-a-Number” value) : Il faut d’abord savoir qu’il n’y a pas un nombre particulier, précis représentant le NaN. Dans IEEE 754, NaN est défini comme tout nombre à virgule flottante dont tous les bits d’exposant (exponent bits) sont à 1 et la partie fractionnaire (fractional part) ayant n’importe quelle valeur différente de zéro (any non-zero value). Donc on peut bien avoir NaN !==NaN. II. La précédence (préséance) des opérateurs, exemple illustratif : <script type="text/javascript"> "use strict"; var num = 10; console.log( 5 == num / 2 && !(3 + 2 * num).toString() == false); // Affiche true. console.log( 5 == num / 2 && !(3 + 2 * num).toString() === ""); // Affiche false. console.log((3 + 2 * num).toString() == false) // false console.log(!(3 + 2 * num).toString() == false) // true console.log((3 + 2 * num).toString() === false) //false console.log(!(3 + 2 * num).toString() === false) // true console.log((3 + 2 * num).toString() == "") // false console.log(!(3 + 2 * num).toString() == "") // true DIASOLUKA Nz. Luyalu 5 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number console.log((3 + 2 * num).toString() === "") // false console.log(!(3 + 2 * num).toString() === "") // false console.log(!(3 + 2 * num)) // false </script> III. Le typecasting : 1. Dans les opérations arithmétiques (outre l’addition = concaténation) les chaînes sont converties ("implied typecasting) en nombres : 25 - "10" = 15 ; 25 * "10" = 250 ; 25 / "10" = 2.5... 2. Dans les opérations de concaténation (toute addition impliquant une chaîne de caractères) ce sont les autres types qui sont convertis en chaîne de caractères. 3. Dans l’addition d’un nombre et une string, le nombre est coercé en string : 25 + "10" = "2510". 4. Dans l’addittion d’un Boolean et une string, le Boolean est coercé en string : true + "false" = "truefalse". 5. Dans l’addition d’un nombre et un Boolean, le Boolean est coercé en nombre : true + 10 = 11 ; false + 10 = 10. 6. Dans les opérations de comparaison, les strings (chaînes) sont coercées en nombres : 10 < "050" = true. Voyez donc ceci à la console : "88"+77 -> "8877" 88+"77" -> "8877" "88+77" -> "88+77" 88+77 -> 165 "Somme = " + 4 + 7 -> "Somme = 47" "Somme = "+1*4+7 -> "Somme = 47" "Somme = "+1*(4+7) -> "Somme = 11" DIASOLUKA Nz. Luyalu 6 / 33 vendredi 31 mai 2019 (6:45 PM) "Somme "Somme "Somme "Somme "Somme = = = = = Le type Number "+(4+7) -> "Somme = 11" "+-(-4-7) -> "Somme = 11" "+eval(4+7) -> "Somme = 11" "+eval(4)+eval(7) -> "Somme = 47" "+parseInt(4)+parseInt(7) -> "Somme = 47" Et dans un code : <script type="text/javascript"> "use strict"; let n1=prompt("Donnez un nombre", Math.floor(Math.random()*100)); const n2=prompt("Donnez un auttre nombre", Math.floor(Math.random()*100)); console.log(n1+" + "+n2+" = "); console.log(n1 + n2); console.log(parseInt(n1) + parseInt(n2)); console.log(eval(n1) + eval(n2)); let n1e=eval(n1), n2e=eval(n2); console.log(n1e + n2e); let n1p=parseInt(n1), n2p=parseInt(n2); console.log(n1p + n2p); </script> DIASOLUKA Nz. Luyalu 7 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number Vous pouvez forcer une coercion (conversion explicite) : 1. La fonction parseInt() covertit excplicitement un numérique littéral en entier, 2. La fonction parseFloat() covertit excplicitement un numérique littéral en nombre Le numérique littéral doit être au début de la chaîne. <script type="text/javascript"> "use strict"; var i = "1980 mille neuf cent quatre-vingt"; var f = "19.80 dix-neuf point quatre-vingt"; console.log(i); // 1980 mille neuf cent quatre-vingt console.log(f); // 19.80 dix-neuf point quatre-vingt console.log(parseInt(i)); // 1980 console.log(parseFloat(i)); // 1980 console.log(parseInt(f)); // 19 console.log(parseFloat(f)); // 19.8 </script> DIASOLUKA Nz. Luyalu 8 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number Affichage en nombre des chiffres significatifs (nnn.ddd...) : <script type="text/javascript"> var num = new Number(1234); "use strict"; console.log(num.toPrecision()); // 1234 console.log(num.toPrecision(2)); // 1.2e+3 num = new Number(1234.5678); console.log(num); // Number console.log(num.valueOf()); // console.log(num.toString()); // console.log(String(num)); // console.log(num.toPrecision()); // console.log(num.toPrecision(2)); // console.log(num.toPrecision(3)); // console.log(num.toPrecision(4)); // console.log(num.toPrecision(9)); // </script> { 1234.5678 } 1234.5678 1234.5678 1234.5678 1234.5678 1.2e+3 1.23e+3 1235 1234.56780 Affichage en pas fixe des décimales (NNN... . ddd...) : <script type="text/javascript"> var num = new Number(123); console.log(num.toFixed()); console.log(num.toFixed(2)); num = new Number(123.4560); console.log(num); // console.log(num.valueOf()); console.log(num.toString()); console.log(String(num)); console.log(num.toFixed()); console.log(num.toFixed(2)); console.log(num.toFixed(3)); console.log(num.toFixed(4)); console.log(num.toFixed(8)); </script> DIASOLUKA Nz. Luyalu "use strict"; // 123 // 123.00 Number { 123.456 } // 123.456 // 123.456 // 123.456 // 123 // 123.46 // 123.456 // 123.4560 // 123.45600000 9 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number Affichage Exponentiel (N.xx...Eee) : <script type="text/javascript"> var num = new Number(1234); "use strict"; console.log(num.toExponential()); // 1.234e+3 console.log(num.toExponential(2)); // 1.23e+3 num = new Number(123.4560); console.log(num); // Number { 123.456 } console.log(num.valueOf()); // 123.456 console.log(num.toString()); // 123.456 console.log(String(num)); // 123.456 console.log(num.toExponential()); // 1.23456e+2 console.log(num.toExponential(2)); // 1.23e+2 console.log(num.toExponential(3)); // 1.235e+2 console.log(num.toExponential(4)); // 1.2346e+2 console.log(num.toExponential(8)); // 1.23456000e+2 </script> IX. Une autre façon de formater les nombres : <script type="text/javascript"> "use strict"; var number = Math.PI; console.log(number); // 3.141592653589793 console.log( new Intl.NumberFormat( "fr-BE" ).format( number ) ); // 3,142 console.log( new Intl.NumberFormat( "fr-BE", { "style" : 'currency', "currency" : 'EUR' } ) .format( number ) ); // 3,14 € console.log( new Intl.NumberFormat( "fr-BE", { "style" : 'currency', "currency" : 'USD' }).format( number ) ); // 3,14 $US DIASOLUKA Nz. Luyalu 10 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number console.log( new Intl.NumberFormat( "fr-BE", { "style" : 'currency', "currency" : 'JYN' }).format( number ) ); // 3,14 JYN console.log( new Intl.NumberFormat( "fr-BE", { "style" : 'currency', "currency" : 'JPY' }).format( number ) ); // 3 JPY console.log( new Intl.NumberFormat( "fr-BE", { "style" : 'currency', "currency" : 'LST' }).format( number ) ); // 3,14 LST console.log( new Intl.NumberFormat( "fr-BE", { "style" : 'currency', "currency" : 'FRC' }).format( number ) ); // 3,14 FRC </script> Manipulations des dates : <script> // Dete et heure en cours. var auj = new Date(); var mois = auj.getMonth()+1, jour = auj.getDate(), an = auj.getFullYear(), hr = auj.getHours(), min = auj.getMinutes(), sec = auj.getSeconds(), mil = auj.getMilliseconds(); // Manipulation directe de chaque élément de la date. console.log(jour + '-' + mois + '-' + an+' T '+ hr + ':' + min + ':' + sec + ':' + mil); console.log(auj.getTime()); // RÉGLER L'ANNÉE. auj.setFullYear(2920) // Régler le mois. auj.setMonth(6) // Les moins vont d'indice 0 (6=7) // Régler le jour. auj.setDate(15) // Les moins vont d'indice 0 (6=7) console.log(auj.toLocaleDateString("fr-Fr")+ " T "+ DIASOLUKA Nz. Luyalu 11 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number auj.toLocaleTimeString("fr-Fr")); console.log(auj.toISOString("fr-Fr")); // Tous les get ont leurs équivalents set auj.setFullYear(auj.getFullYear()+10) // AJOUTER 10 ANS. auj.setMonth(auj.getMonth()-5) // SOUSTRAIRE 5 MOIS. auj.setDate(auj.getDate()-14) // SOUSTRAIRE 2 SEMAINES. console.log(auj.toLocaleDateString("fr-Fr")); // RÉGLER LA DATE LORS DE LA CRÉATION auj=new Date("1980 Feb 11 15 07:25:350Z") console.log(auj.toLocaleDateString("fr-Fr")+ " T "+ auj.toLocaleTimeString("fr-Fr")); auj=new Date("Feb 1980 11 15:07:25:350 -05:00") console.log(auj.toLocaleDateString("fr-Fr")+ " T "+ auj.toLocaleTimeString("fr-Fr")); </script> Exécution avec YANDEX : Exécution avec FIREFOX : DIASOLUKA Nz. Luyalu 12 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number X. Les options d’affichage de la date : <script> const cl=console.log; var date = new Date(Date.UTC(+002018, 10, 24, 14, 5, 10, 250)); // identique à « var date = (new.Date()).getTime()); » // cl((new Date()).getTime()); // cl((new Date()).getTime()); // cl((new Date()).valueOf()); var options = { weekday: "long", year: "numeric", month: "long", day: "numeric", hour: "2-digit", minute: "2digit", second: "2-digit"}; var options2 = { weekday: "short", year: "numeric", month: "short", day: "numeric", hour: "2-digit", minute: "2digit", second: "2-digit"}; cl(date.valueOf()); // 1543068310250 cl(date.valueOf().toLocaleString()); // 1,543,068,310,250 cl(date.toLocaleString()); // 11/24/2018, 3:05:10 PM cl(date.toLocaleString().length); // 22 cl("*********"); cl(date.toLocaleDateString("en-US")); // 11/24/2018 cl(date.toLocaleDateString("fr-FR")); // 24/11/2018 cl(date.toLocaleDateString("ja-JA")); DIASOLUKA Nz. Luyalu 13 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number // 2018/11/24 cl(date.toLocaleDateString("en-US", options)); // Saturday, November 24, 2018, 3:05:10 PM cl(date.toLocaleDateString("fr-FR", options)); // samedi 24 novembre 2018 à 15:05:10 cl(date.toLocaleDateString("en-US", options2)); // Sat, Nov 24, 2018, 3:05:10 PM cl(date.toLocaleDateString("fr-FR", options2)); // sam. 24 nov. 2018 à 15:05:10 cl(date.toLocaleDateString("ja-JA", options)); // 2018?11?24???? 15:05:10 cl(date.toLocaleDateString("ja-JA", options)); // 2018?11?24???? 15:05:10 cl("*********"); cl(date.toLocaleTimeString("en-us")); // 3:05:10 PM cl(date.toLocaleTimeString("fr-FR")); // 15:05:10 cl(date.toISOString("fr-FR")); // 2018-11-24T14:05:10.250Z cl(date.toLocaleTimeString("ja-JA")); // 15:05:10 cl(date.toLocaleTimeString("en-us", options)); // Saturday, November 24, 2018, 3:05:10 PM cl(date.toLocaleTimeString("fr-FR", options)); // samedi 24 novembre 2018 à 15:05:10 cl(date.toISOString("fr-FR", options)); // 2018-11-24T14:05:10.250Z cl(date.toLocaleTimeString("en-us", options2)); DIASOLUKA Nz. Luyalu 14 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number // Sat, Nov 24, 2018, 3:05:10 PM cl(date.toLocaleTimeString("fr-FR", options2)); // sam. 24 nov. 2018 à 15:05:10 cl(date.toLocaleTimeString("ja-JA", options2)); // 2018?11?24?(?) 15:05:10 cl(date.toLocaleTimeString("ja-JA", options2)); // 2018?11?24?(?) 15:05:10 </script> DIASOLUKA Nz. Luyalu 15 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number X. Récursivité (récurrence - Factorielle d’un nombre) : <script type="text/javascript"> var vin=170; let fact = function ( n ) { if ( n == 0) return 1; else return fact ( n - 1) * n ; }; console.log(vin+"! = "+fact(vin)); </script> // 170! = 7.257415615307994e+306 Note : Nous venons de voir là une méthode de l'objet Math. En voici d'autres ainsi que les propriétés. Les Méthodes sont des fonctions intrinsèques,intégrées/incorporées, built-in dans l’objet. Elles ont des parenthèses (). Les Propriétés n’ont pas de parenthèses et représentent,ici des constantes. Les Propriétés et Méthodes sont accessibles via l'objet ici l’objet Math, et leur notation DOIT donc être précédée de « Math. » (Math avec M majuscule et le reste en minuscules, suivi d’un point sans espace devant et après le point) : XI. Méthodes et propriétés standards de l’objet Math : abs(N), ceil(N), floor(N), round(N), trunc(N), max(N1,N2), min(N1,N2), pow(B,P), random(N), sqrt(N). DIASOLUKA Nz. Luyalu 16 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number Logarithmes et exponentielle avec l’objet Math : E, exp(N), LN2, LN10, log(N), LOG2E, SQRT1_2, SQRT2. Trigonométrie avec l’objet Math : PI, sin(N), asin(N), cos(N), acos(N), tan(N), atan(N). Notez la virgule de chaînage entre « k=0 » et « a.toLocaleSt... » <script> var a=new Date(9999,12,31).toLocaleString(); console.log(a.length); for(k=0 , l=a.length ; k < 10 ; k++) console.log(k*l) </script> // 23 // 0 23 46 69 92 115 138 161 184 207 Dans l’exemple qui suit, quand la condition « a<=5 ? » est remplie, le chaînage « c = Math.pow(a,2) , d=b*b , e=2*a*b ; » ne se passe pas comme on pourrait s’y attendre (seule la première expression « c = Math.pow(a,2) » n’est pas exécutée , les deux autres (« d=b*b » et « e=2*a*b » ;) sont exécutées : <script> var a=Math.round(Math.random()*10) , b=Math.ceil(Math.log(a)) , c=d=e=0 , v ; v = a<=5 ? a*a + b*b + 2*a*b : DIASOLUKA Nz. Luyalu 17 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number c = Math.pow(a,2) , d=b*b , e=2*a*b ; console.log(v+" || "+a+"_"+b+" || "+c+"_"+d+"_"+e) </script> Exécution : La condition « a<=5 ? » est remplie (a==4, inf ou == 5), l’expression avant le double-point est exécutée, Aucune expression dans le chaînage après ce double-point ne devrait être exécutée, mais seule la première expression est ignorée (v a pris la valeur de l’expression « a^2 + b^2 + 2*a*b » d’avant le double-point), « c = Math.pow(a,2) » n’a pas été exécutée (c a gardé sa valeur initiale = valeur d’initialisation), mais les deux autres « d=b*b » et « e=2*a*b » ont été évaluées (exécutées). 4_2 || 0_4_16 La condition « a<=5 ? » n’est pas remplie (a==7, > 5), l’expression avant le double-point n’est pas exécutée, toute la chaîne d’expressions après ce « : » est exécutée. v prend la valeur de la première expression dans la chaîne d’instructions après le « : » . 49 || 7_2 || 49_4_28 XII. Particularités de const, let et var : Alors que JS en sloppy mode (mode standard) autorise d’utiliser une variable sans la déclarer au préalable, JS en mode strict ("use strict" ;) n’accepte pas d’utiliser une variable non, déclarée (avant ou après sa première utilisation dans un scope donné). En mode sloppy : <script type="text/javascript"> d=Date(); console.log(d); DIASOLUKA Nz. Luyalu 18 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number // Sat Feb 24 2018 22:21:20 GMT+0100 (Paris, Madrid) </script> En mode « use strict » : <script type="text/javascript"> "use strict"; d=Date(); console.log(d); // Sat Feb 24 2018 22:21:20 GMT+0100 (Paris, Madrid) </script> Yandex : Firefox : Variable déclarée avec « var » après sa première utilisation : <script type="text/javascript"> "use strict"; d=Date(); console.log(d); var d; // Sat Feb 24 2018 22:34:35 GMT+0100 (Paris, Madrid) </script> Contrairement à « var », « let » n’admet pas de déclaration différée de variable, mais aussi d’expression de fonction : <script type="text/javascript"> "use strict"; d=Date(); console.log(d); let d; DIASOLUKA Nz. Luyalu 19 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number // ReferenceError: can't access lexical // declaration `d' before initialization [FIREFOX] // // Uncaught ReferenceError: // d is not defined at test.html:2 [YANDEX] // Uncaught ReferenceError: d is not defined [BAIDU] </script> De même contrairement à « var », « let » n’admet pas de redéclaration ni de redéfinition de la même variable dans le même scope : <script type="text/javascript"> "use strict"; var v; var v; let l; let l; </script> /* FIERFOX : YANDEX : */ Tandis que « const » exige l’initialisation pendant l’unique déclaration (n’accepte ni une réaffectation ni une redéclaration dans la même portée de bloc). DIASOLUKA Nz. Luyalu 20 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number <script type="text/javascript"> "use strict"; d=Date(); console.log(d); const d; </script> /* Firefox : Yandex : Baidu (ancienne version) : */ Les valeurs des propriétés d’un objet const peuvent cependant être modifiées : <script type="text/javascript"> "use strict"; const obj = {id: 'dias'}; ////// obj = {id: 'wille'}; // TypeError: // invalid assignment to const `obj' [FIREFOX] // Uncaught TypeError: // Assignment to constant variable.[YANDEX] obj.id = 'wille'; console.log(obj); // Object { id: "wille" } </script> Dans les deux modes (sloppy et strict), une variable ou une expression de fonction ne peuvent être déclarées qu’avec l’un des trois mots clés suivants : const, let ou var, avec les spécificités suivantes : DIASOLUKA Nz. Luyalu 21 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number 1. « const » (définit une entité constante, identificateur qui ne peut être redéfini) et « let » (définit une variable ou une expression de fonction) sont de portée (scope = domaine) bloc quel qu’il soit : <script type="text/javascript"> "use strict"; { let li=7 ; {console.log(li) /* 7 */} }; console.log(li) // ReferenceError: li is not defined [FIREFOX] // Uncaught ReferenceError: li is not defined [YANDEX] </script> <script type="text/javascript"> "use strict"; { const ci=10 ; {console.log(ci) /* 10 */} }; console.log(ci) // ReferenceError: ci is not defined [FIREFOX] // Uncaught ReferenceError: ci is not defined [YANDEX] </script> 2. Une entité « const » ne peut être redéclarée, redéfinie ou réaffectée : <script type="text/javascript"> "use strict"; const cf=function(){console.log(Date())}; cf(); cf=function(){console.log(Math.PI)}; </script> // YANDEX : // FIREFOX : DIASOLUKA Nz. Luyalu 22 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number // BAIDU : 3. « var » est de scope bloc de fonction ou fichier : <script type="text/javascript"> "use strict"; let lg=5; const cg=20 ; { // Bloc vraiment ordinaire. var vb=15; console.log(cg); // 20. Visible ds bloc imbriqué. } console.log(lg, cg, vb); // 5 20 15 // vb est visible en dehors du bloc ordin, // mais ne le serait pas hors un bloc de fct, // cfr ci-dessous. const cf=function(){var vf=10;}; console.log(vf); </script> [BAIDU/YANDEX] [FIREFOX] DIASOLUKA Nz. Luyalu 23 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number 4. const DOIT être initialisé au même moment que sa déclaration, <script type="text/javascript"> "use strict"; const c2; c2="const"; </script> /* [FIREFOX] [YANDEX] [BAIDU] */ 5. « var » et autres dans définition de fonction non expression : En mode strict, une expression de fonction DOIT être précédée de var, const ou let pour la définition / déclaration de fonction. Mais la définition simple de fonction ne doit jamais commencer par ces mots clés. <script type="text/javascript"> "use strict"; function f(){console.log(Math.SQRT2)}; f(); // 1.4142135623730951 </script> <script type="text/javascript"> "use strict"; const function lf(){console.log(Math.SQRT2)}; // SyntaxError: missing variable name [FIREFOX] // Uncaught SyntaxError: Unexpected token function [YANDEX] </script> <script type="text/javascript"> "use strict"; DIASOLUKA Nz. Luyalu 24 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number var function vf(){console.log(Math.SQRT2)}; // SyntaxError: missing variable name [FIREFOX] // Uncaught SyntaxError: Unexpected token function [YANDEX] </script> <script type="text/javascript"> "use strict"; let function lf(){console.log(Math.SQRT2)}; // SyntaxError: let is a reserved identifier [FIREFOX] // Uncaught SyntaxError: Unexpected strict mode reserved word [YANDEX] </script> /* [FIREFOX] [YANDEX] [BAIDU] */ Si une const ne peut être ni redéclarée, ni redéfinie, ni réaffectée, la valeur qu’elle renferme peut cependant être modifiée : DIASOLUKA Nz. Luyalu 25 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number <script type="text/javascript"> "use strict"; const arr = ['A','B']; const C = arr; // arr et C ne peuvent être // redéclarés, redéfinis, ou réaffectés. console.log(C); // Array [ "A", "B" ] // Mais la valeur de arr ou de C peuvent changer // Méthode directe via les éléments. [ arr[0],arr[1] ] = ['X' , 'Z']; console.log(C); // Array [ "X", "Z" ] arr[0]= ["autre","array"] ; arr[1] = {'X':'x' , 'Z':'z'}; console.dir(C); console.dir(arr); // […] , 0: "Zéro" , 1: "Un" , 2: "spl2" , 3: "PUSHÉ" // length: 4 // Méthode directe via les méthodes... arr.push('PUSHÉ'); arr.splice(1,1,"spl1","spl2"); console.log(C); // Array [ […], "spl1", "spl2", "PUSHÉ" ] // […], 0: "Zéro", 1: "Un", 2: "spl2", 3: "PUSHÉ" // length: 4 // La valeur de arr ou de C peuvent aussi changer // par Méthode indirecte (p.e. du sein d'une fonc-tion) console.log("fct(C)= ",fct(C)); console.log("C=",C); // constante comme argument. console.log("arr=",arr); // Array [ "Zéro", "Un", "spl2", "PUSHÉ" ] // […], 0: "Zéro", 1: "Un", 2: "spl2", 3: "PUSHÉ" // length: 4 DIASOLUKA Nz. Luyalu 26 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number function fct(p){ p[0]="Zéro", p[1]="Un"; return p; } </script> XIII. Techniques pour programmer le PGCD de deux entiers : A. Par le biais des plus petits diviseurs communs : 1 Les deux entiers dans une array : <script type="text/javascript"> "use strict"; var r,d,n1=2040,n2=39960 function pgcd(o){ o=o.sort().reverse() // n1 > n2 console.log(Object.values(o)) DIASOLUKA Nz. Luyalu 27 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number var pq=1; for(var p=2 ; p<o[0]/2 ; p++){ for(var k=2 ; k<o[0]/2 ; k++){ if(!(o[0]%k) && !(o[1]%k)){ pq*=k; o=o.map(x=>x/k) console.log(pq+" "+k+" "+o) } } } return pq } r=pgcd([n1,n2]) // L’array des deux entiers. console.log("pgcd ("+n1+" & "+n2+") = "+ r+" ("+n1/r+" & "+n2/r+") ") </script> Les deux entiers dans un littéral d’objet : 2 <script type="text/javascript"> "use strict"; var r,d,n1=4020, n2=2040 ; // n1 >2 function pgcd(o){ console.log(Object.values(o)); var pq=1; for(var p=2 ; p<o.n1/2 ; p++){ for(var k=2 ; k<o.n1/2 ; k++){ if(!(o.n1%k) && !(o.n2%k)){ pq*=k; o.n1/=k, o.n2/=k; console.log(pq+" "+k+" "+Object.values(o)) } } DIASOLUKA Nz. Luyalu 28 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number } return pq } r=pgcd(d={n1:n1,n2:n2}); console.log("pgcd ("+n1+" & "+n2+") = "+ r+" ("+n1/r+" & "+n2/r+") ") </script> 3 Plus simple (avec des primitives) : <script type="text/javascript"> "use strict"; var r,d,n1,n2; function pgcd(n1,n2){ console.log(n1,n2); var pq=1; for(var p=2 ; p<n1/2 ; p++){ for(var k=2 ; k<n1/2 ; k++){ if(!(n1%k) && !(n2%k)){ pq*=k; n1/=k, n2/=k; console.log(pq+" "+k+" "+n1+" "+n2); } } } return pq; } r=pgcd(n1=Math.round(Math.random()*1e4), n2=Math.round(Math.random()*1e5)); console.log("pgcd ("+n1+" & "+n2+") = "+ DIASOLUKA Nz. Luyalu 29 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number r+" ("+n1/r+" & "+n2/r+") "); </script> B. Selon les deux principes : PGCD ( a , b ) = PGCD ( b , a mod b ) et PGCD ( a , 0 ) = a. : 1 Les deux entiers dans une array : <script type="text/javascript"> "use strict"; // PGCD(a,b) = PGCD (b,a mod b) et PGCD(a,0) = a. var r,d, n1=2040,n2=39972; // Les deux entiers function pgcd(a){ a=asort(a); // n1 > n2 console.log(Object.values(a),+" "+n1+" "+n2); var pq=1; while(a[1]) a=[a[1], a[0]%a[1]] , console.log(a); return a[0]; } r=pgcd([n1,n2]); // L’array des deux entiers. console.log("pgcd ("+n1+" & "+n2+") = "+ r+" ("+n1/r+" & "+n2/r+") "); function asort(a){ return a.sort().reverse(); // n1 > n2 } </script> DIASOLUKA Nz. Luyalu 30 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number Kinshasa, le vendredi, 31. mai 2019 (6:45:16 PM). Mots-clés : Number, NaN, null, undefined, IEEE, mode strict, use strict, paramètres par défaut, initialisé, PGCD, enumerable, for...in, itérable, Itération Synchrone DIASOLUKA Nz. Luyalu Docteur en Médecine, Chirurgie & Accouchements (1977), CNOM : 0866 - Spécialiste en ophtalmologie (1980) 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é. DIASOLUKA Nz. Luyalu 31 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number +243 - 851278216 - 899508675 - 995624714 - 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 : • https://www.scribd.com/document/377036251/Le-Dosage-DesMedicaments-en-Cac-Cas • https://www.scribd.com/document/377035454/Le-Hasard-DesThermometres-Non-contact-a-Infrarouge • https://www.scribd.com/document/376222482/Petite-IntroductionAux-Fonctions-JavaScript • https://www.scribd.com/document/376221919/La-Foi-en-Jesus-ChristPour-Quoi-Faire • https://www.scribd.com/document/375689778/Lacuite-visuelleangulaire • https://www.scribd.com/document/375349851/La-variable-This • https://www.scribd.com/document/375024162/Fonctions-Imbriqueesen-JS • https://www.scribd.com/document/374789297/Format-Interne-DesObjets-JavaScript • https://www.scribd.com/document/374788758/Iterations-en-JavaScript • https://www.scribd.com/document/374738470/Le-Plus-Grand-Secretde-La-Creation • https://www.scribd.com/document/374597969/Nouvelle-Formule-dIMC-indice-de-doduite-Selon-Dr-Diasoluka • https://www.scribd.com/document/373847209/Property-Descriptors • https://www.scribd.com/document/373833282/l-Objet-Global-Window DIASOLUKA Nz. Luyalu 32 / 33 vendredi 31 mai 2019 (6:45 PM) Le type Number • https://www.scribd.com/document/372665249/Javascript-Tome-II • https://www.scribd.com/document/355291488/motilite-oculaire-2 • https://www.scribd.com/document/355291239/motilite-oculaire-I • https://www.scribd.com/document/355290248/Script-d-Analyses-DesReflexes-Pupillomoteurs • https://www.scribd.com/document/321168468/Renseignements-Id-etAnthropometriques • https://www.scribd.com/document/320856721/Emission-31-Jul-2016 • https://www.scribd.com/document/318182982/Complication-Visuelledu-Traitement-de-La-Malaria • https://www.scribd.com/document/318180637/Rapport-EntreOxymetrie-Et-Type-Respiration • https://www.scribd.com/document/315746265/Classification-DesMedicaments • https://www.scribd.com/document/315745909/IncongruencesHeresies-et-Heterodoxies-de-la-Notion-de-Laboratoire • https://www.scribd.com/document/315745725/Rapport-EntreOxymetrie-Et-Type-Respiration DIASOLUKA Nz. Luyalu 33 / 33 vendredi 31 mai 2019 (6:45 PM)