Parcours
/
JavaScript
JavaScript
/
Exercices
/
Nombres porte-bonheur
Nombres porte-bonheur

Nombres porte-bonheur

Exercice d'apprentissage

Introduction

En JavaScript, les valeurs peuvent être de différents types. On peut changer le type d'une variable par une conversion de type explicite. En plus de cela, JavaScript effectue aussi une coercition de type (conversion de type implicite) quand le contexte l'exige.

Conversion de type

Contrairement à beaucoup d'autres langages, JavaScript n'a pas de construction permettant de convertir une valeur vers un autre type, mais on peut utiliser à la place certains utilitaires intégrés. En particulier, Boolean, Number et String peuvent être utilisés comme des fonctions pour convertir une valeur vers le type correspondant.

Convertir en booléen (valeurs truthy/falsy)

Avec Boolean(value), tu peux convertir n'importe quelle valeur en booléen. Il existe un ensemble fixe de valeurs, appelées valeurs falsy, qui sont converties en false. En particulier, false, 0, une string vide, null, undefined et NaN sont falsy.

Pour toutes les autres valeurs, Boolean renvoie true. Ces valeurs sont dites truthy.

Boolean(-1);
// => true

Boolean(0);
// => false

Boolean(' ');
// => true

Boolean('');
// => false

Note que, d'après les règles décrites, '0', 'false', [] et {} sont truthy en JavaScript.

Convertir en nombre

On peut utiliser Number(value) pour convertir une valeur en nombre. Les espaces au début et à la fin d'une string sont ignorés, et une string vide est convertie en 0. Si tu essaies de convertir une valeur non primitive ou une string qui ne représente pas un nombre, le résultat est NaN (Not-A-Number).

Number('  -12.34  ');
// => -12.34

Number('1,2');
// => NaN

Number('');
// => 0

Number({ num: 123 });
// => NaN

Convertir en string

Avec String(value), tu peux convertir une valeur en string. Pour les valeurs primitives, le résultat est celui auquel on s'attend.

String(12.34);
// => '12.34'

String(false);
// => 'false'

String(null);
// => 'null'

String(undefined);
// => 'undefined'

Pour les tableaux, la fonction String applique la conversion en string à chaque élément, puis joint les résultats avec une virgule. Tu peux aussi appliquer toi-même la méthode join, par exemple pour personnaliser le séparateur. Note que dans ces cas, null et undefined sont convertis en une string vide.

String([42, null, true, 'abc']);
// => '42,,true,abc'

Pour les objets, String renvoie par défaut un texte peu utile.

String({ key: 'value' });
// => '[object Object]'

Coercition de type

Dans certains contextes, JavaScript convertit automatiquement une valeur en un autre type de données avant d'évaluer une instruction. Cette conversion implicite s'appelle la coercition de type.

Contexte booléen

Quand une valeur non booléenne est utilisée dans un contexte booléen, JavaScript applique les mêmes règles que la fonction Boolean pour la convertir implicitement.

La coercition en booléen se produit couramment pour

  • la condition d'une instruction if
  • le premier opérande de l'opérateur ternaire ?
  • l'opérande de l'opérateur de négation logique !
  • les opérandes des opérateurs ET logique && et OU logique || (le résultat de l'expression est l'un des opérandes, pas nécessairement un booléen)
const num = 0;
if (num) {
  // this block is NOT executed because 0 is falsy
}

Contexte de string

Si l'opérateur d'addition + est utilisé avec des valeurs primitives et qu'un opérande est une string, l'autre est lui aussi converti en string. La logique de conversion est la même que celle de la fonction String. Ensuite, les deux strings sont concaténées.

let name;
'hello ' + name;
// => 'hello undefined'

Contexte numérique

De nombreux opérateurs convertissent les opérandes en nombres (si nécessaire) selon la logique de la fonction Number expliquée plus haut.

  • Opérateurs arithmétiques : + (si aucune string n'est impliquée), -, *, /, %, **
  • Opérateurs unaires plus et négation unaire : +, -
  • Opérateurs relationnels (pour des opérandes non string) : >, >=, <, <=
  • Opérateurs bit à bit : |, &, ^, ~

Consulte la liste des opérateurs sur MDN pour plus de détails sur chacun de ces opérateurs.

Pour éviter les erreurs, il est recommandé d'appeler explicitement Number avant d'appliquer ces opérateurs.

Instructions

Ton ami Kojo est un grand fan de nombres. Il a un petit site web appelé « fun-with-numbers ». Kojo n'est pas très bon en programmation, alors il t'a demandé de l'aide.

Tu vas créer deux fonctions auxiliaires pour de nouveaux jeux de nombres sur le site de Kojo, et une troisième pour valider certaines entrées que l'utilisateur peut saisir.

1. Calcule la somme des nombres sur la machine à sous

L'un des jeux sur le site de Kojo ressemble à une machine à sous qui affiche deux groupes de roues avec des chiffres dessus. Chaque groupe de chiffres représente un nombre. Pour la mécanique du jeu, Kojo a besoin de connaître la somme de ces deux nombres.

Écris une fonction twoSum qui prend deux tableaux en paramètres. Chaque tableau contient un ou plusieurs nombres entre 0 et 9. La fonction doit interpréter chaque tableau comme un nombre et renvoyer la somme de ces deux nombres.

twoSum([1, 2, 3], [0, 7]);
//=> 130

// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130

2. Détermine si un nombre est un palindrome

Un autre jeu sur le site est un petit quiz appelé « Nombres chanceux ». Un utilisateur peut saisir un nombre et voit ensuite si ce nombre appartient à une séquence ou à un motif secret. La séquence ou le motif des « nombres chanceux » change chaque mois, et chaque utilisateur ne dispose que d'un nombre limité d'essais pour le deviner.

Les nombres chanceux de ce mois-ci doivent être des nombres palindromes. Les nombres palindromes restent identiques lorsqu'on inverse leurs chiffres.

Implémente la nouvelle fonction luckyNumber qui prend un nombre en paramètre. La fonction doit renvoyer true si le nombre est un palindrome et false sinon. Le nombre en entrée sera toujours un entier positif.

luckyNumber(1441);
//=>  true

luckyNumber(123);
//=> false

3. Génère un message d'erreur pour une entrée utilisateur invalide

À divers endroits sur le site, il y a des champs de saisie où les utilisateurs peuvent saisir des nombres et cliquer sur un bouton pour déclencher une action. Kojo veut améliorer l'expérience utilisateur de son site. Il veut afficher un message d'erreur si l'utilisateur clique sur le bouton alors que le champ contient une valeur d'entrée invalide.

Voici quelques informations supplémentaires sur la manière dont la valeur d'un champ de saisie est fournie.

  • Si l'utilisateur saisit quelque chose dans un champ, la valeur associée est toujours une string, même s'il n'a saisi que des nombres.
  • Si l'utilisateur saisit quelque chose puis l'efface, la variable sera une string vide.
  • Avant même que l'utilisateur ait commencé à saisir, la variable peut être undefined ou null.

Écris une fonction errorMessage qui prend l'entrée utilisateur en paramètre. Si l'utilisateur n'a fourni aucune entrée, errorMessage doit renvoyer 'Required field'. Si l'entrée ne représente pas un nombre différent de zéro (selon les règles de conversion JavaScript), il faut renvoyer 'Must be a number besides 0'. Dans tous les autres cas, tu peux considérer que l'entrée est valide, la valeur de retour doit être une string vide.

errorMessage('123');
// => ''

errorMessage('');
// => 'Required field'

errorMessage('abc');
// => 'Must be a number besides 0'
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
JavaScript Exercism

Prêt à commencer Nombres porte-bonheur ?

Inscris-toi sur Exercism pour apprendre et maîtriser JavaScript avec 37 concepts159 exercices, et un vrai mentorat humain, le tout gratuitement.