DanLevy.net

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é.

parseInt("123,456.00")

En général, parseInt s’arrête de parser lorsqu’il rencontre un caractère non numérique. Ici, il s’arrête à la virgule, donc seul 123 est renvoyé.

0.1 + 0.2 === 0.3

En 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.

BigInt("42") === parseInt("42")

BigInt est un type différent de number, donc parseInt("42") (un nombre ordinaire) n’est pas strictement égal à BigInt("42"). Pour comparer, vous devez convertir les deux au même type : BigInt(parseInt("42")) === BigInt("42").

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.)

C’est quoi le truc ici ?

parseInt('0xFF', 16)

parseInt avec une base hexadécimale (16) convertit "FF" en 255 décimal. Vous avez peut‑être vu cela dans les codes couleur CSS RGB/Hex.

[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)).

[24, 'Twenty1', 0o42].map(Number)

Number convertit les valeurs en type numérique de façon plus stricte que parseInt. Ici, 'Twenty1' devient NaN, tandis que 0o42 est reconnu comme un littéral octal et converti en 34.

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

FunctionparseIntparseFloatNumberBigInt
Ignores Whitespace
.map(FN)☑️
Supports Radix Arg
Binary/Octal/Hex literals
Invalid chars 42 oh no4242NaNSyntaxError

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 ! 💪