Quiz : Pouvez‑vous compter sur JavaScript ?
Vous maîtrisez la différence entre parseInt et parseFloat ?
parseInt(" 123456.00")parseInt ignore les espaces et analyse la séquence initiale de chiffres comme un entier. Ici, il s’arrête au point décimal, donc seul 123456 est renvoyé.
0.1 + 0.2 === 0.3En raison des erreurs de précision des nombres à virgule flottante, 0.1 + 0.2 n’est pas exactement égal à 0.3. À cause de la façon dont les nombres à virgule flottante sont stockés en mémoire, le résultat est 0.30000000000000004. Le standard IEEE 754 qui gère l’arithmétique en virgule flottante est en cause : il ne peut pas représenter certains nombres exactement. C’est un problème commun à tous les langages de programmation. Au final vous tomberez sur un décimal qui se répète à l’infini, et quel que soit le langage, l’ordinateur doit simplement arrêter de poursuivre des chiffres infiniment répétés.
Certains langages comme Python et Java disposent de Decimal ou BigDecimal pour gérer cela, mais ce n’est pas intégré à JavaScript. Vous pouvez utiliser des bibliothèques comme big.js ou decimal.js pour ces cas.
(Note : Certains langages sont conçus pour gérer les fractions, les nombres imaginaires, etc., à un niveau logique supérieur, en préservant les expressions littérales. Mais ils doivent tout de même faire face aux mêmes problèmes de précision des nombres à virgule flottante au niveau matériel.)
Number.MAX_VALUE * 2Étant donné que Number.MAX_VALUE est le plus grand nombre représentable ordinaire en JavaScript, dépasser sa limite provoquera rapidement un débordement – vous obtiendrez essentiellement des résultats dénués de sens. Le multiplier par 2 donne Infinity.
Vous savez, JavaScript, c’est parfois comme ça.
Que pourrait‑il faire ?
5..toFixed(2).toFixed(2) renvoie une représentation sous forme de chaîne de 5 avec deux décimales, donc le résultat est "5.00".
Le double point (5..toFixed(2)) est une « astuce » pour accéder au modèle d’objet des littéraux numériques.
parseInt("42") === parseFloat("42")En JavaScript, parseInt et parseFloat interprètent tous deux la chaîne "42" comme le nombre 42. Ainsi, la comparaison parseInt("42") === parseFloat("42") évalue à true. parseInt s’arrête dès le premier caractère non numérique, tandis que parseFloat continue tant qu’il rencontre des caractères faisant partie d’un nombre à virgule flottante. Cependant, comme il n’y a ni point décimal ni autre caractère non numérique dans "42", les deux fonctions renvoient la même valeur.
Quel sera le résultat ?
parseInt("0x2A") === parseInt("2a", 16)Toute chaîne d’entrée qui commence par 0x est automatiquement traitée comme une valeur hexadécimale (radix 16).
Elle est donc équivalente à passer un radix de 16. Ainsi, parseInt("0x2A") est identique à parseInt("2a", 16). (C’est insensible à la casse.)
[24, 'One', 42].map(parseInt)Le deuxième argument de parseInt (la base) correspond à l’argument index des méthodes de tableau. Cela entraîne des résultats inattendus, car parseInt("One", 1) renvoie NaN à cause de l’entrée invalide.
Le premier élément, 24, est analysé comme 24 en base 0 (détection automatique), il reste donc 24. Le deuxième élément, 'One', est analysé comme NaN en base 1. Le troisième élément, 42, est analysé en base 2. En base 2, '42' donne NaN, donc le résultat est [24, NaN, NaN].
C’est un piège fréquent avec parseInt et map. Si vous voulez convertir un tableau de chaînes en nombres, la seule méthode « intégrée » sûre est .map(Number) ou en ajoutant une fonction de rappel .map(x => parseInt(x, 10)).
Quel sera le résultat de ce code ?
console.log(parseInt(null), Number(null))parseInt contraint l’entrée en chaîne, donc null devient "null". Comme "null" ne contient aucun caractère décimal valide, il renvoie NaN.
Number(null) renvoie 0. parce que JS aime vous surprendre.
Pourquoi ? Je pourrais approfondir si cela intéresse.
Quel sera le résultat de ce sort ?
parseInt(null, 36)Comme parseInt convertit toujours l’entrée en chaîne, null devient la chaîne "null".
En base 36 (hexatrigesimale, si vous suivez), la chaîne "null" représente 1112745.
Les valeurs séquentielles de nulk, null et nulm sont respectivement 1112744, 1112745 et 1112746 en base 36.
Tableau comparatif
| Function | parseInt | parseFloat | Number | BigInt |
|---|---|---|---|---|
| Ignores Whitespace | ✅ | ✅ | ✅ | ✅ |
.map(FN) | ❌ | ☑️ | ✅ | ✅ |
| Supports Radix Arg | ✅ | ❌ | ❌ | ❌ |
| Binary/Octal/Hex literals | ✅ | ❌ | ✅ | ✅ |
Invalid chars 42 oh no | 42 | 42 | NaN | SyntaxError |
Comment vous en êtes‑vous sorti ? 🧐
Vous cherchez une pause après tant de binaire ?
Pftt, rappelez‑vous : faites une pause après les compétences !
Allez sur ma salle pour en décimer d’autres ! 💪