Contrairement à beaucoup d'autres langages, JavaScript possède deux entités différentes pour représenter l'absence de valeur (significative).
Ce sont null et undefined.
La valeur primitive null s'utilise comme une «\u00A0valeur vide\u00A0» intentionnelle pour des variables de n'importe quel type.
let name = null;
// name is intentionally set to "empty" because it is not
// available
On peut vérifier si une variable vaut null en utilisant l'opérateur d'égalité stricte ===.
let name = null;
name === null;
// => true
Une variable à laquelle aucune valeur n'a été affectée est de type
undefined.1
Cela signifie que si null représente une valeur vide (mais une valeur quand même), undefined représente l'absence totale de valeur. 🤯
undefined apparaît dans différents contextes.
undefined.undefined.undefined.undefined, sauf si cet argument a une valeur par défaut.let name;
console.log(name);
// => undefined
On peut vérifier si une variable vaut undefined en utilisant l'opérateur d'égalité stricte ===.
let name;
name === undefined;
// => true
Si tu essaies de récupérer une valeur imbriquée dans un objet alors que la clé parente n'existe pas, JavaScript lève une erreur.
Pour éviter facilement ce problème, le chaînage optionnel a été ajouté à la spécification du langage en 2020.
Avec l'opérateur de chaînage optionnel ?., tu peux t'assurer que JavaScript n'essaie d'accéder à la clé imbriquée que si la clé parente n'était pas null ou undefined.
Sinon, c'est undefined qui est renvoyé.
const obj = {
address: {
street: 'Trincomalee Highway',
city: 'Batticaloa',
},
};
obj.address.zipCode;
// => undefined
obj.residence.street;
// => TypeError: Cannot read property 'street' of undefined
obj.residence?.street;
// => undefined
Il y a des situations où tu veux appliquer une valeur par défaut au cas où une variable vaut null ou undefined (mais seulement dans ce cas).
Pour répondre à ce besoin, l'opérateur de coalescence des nuls ?? a été introduit en 2020.
Il ne renvoie l'opérande de droite que lorsque l'opérande de gauche vaut null ou undefined.
Sinon, c'est l'opérande de gauche qui est renvoyé.
let amount = null;
amount = amount ?? 1;
// => 1
amount = 0;
amount = amount ?? 1;
// => 0
[1] Undefined, MDN. (2021). https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined (consulté le 4 juin 2021).
Ton travail consiste à développer et à maintenir une partie du système informatique d'un parc d'attractions. Tu es notamment responsable du programme qui gère les visiteurs et les billets.
Tu vas d'abord créer un nouveau visiteur dans le système. Ensuite, tu écriras une fonction pour révoquer un billet. Dans les tâches 3 et 4, tu travailleras sur le système de suivi des billets qui aide à prévenir la falsification. Enfin, tu participeras à l'adaptation du système à de nouvelles exigences légales.
Lorsque les visiteurs viennent au parc d'attractions pour la première fois, ils doivent s'inscrire en saisissant leur nom et leur âge dans un terminal et en acceptant les conditions générales.
Bien sûr, ils doivent aussi acheter un billet.
Chaque billet possède un identifiant comme H32AZ123.
Écris une fonction createVisitor qui prend trois arguments.
La fonction doit renvoyer un objet contenant ces informations.
Les clés de l'objet doivent s'appeler name, age et ticketId.
createVisitor('Verena Nardi', 45, 'H32AZ123');
// => { name: 'Verena Nardi', age: 45, ticketId: 'H32AZ123' }
Quand les visiteurs quittent le parc d'attractions, leur billet est révoqué. S'ils reviennent, ils doivent en acheter un nouveau. Pour faire gagner du temps aux visiteurs réguliers, ceux-ci n'ont besoin de s'inscrire qu'une seule fois, et les informations du visiteur sont conservées pour les visites suivantes.
Cela signifie que lorsqu'un visiteur quitte le parc, seul son billet doit être invalidé, tandis que le reste de l'objet visiteur doit rester inchangé.
Implémente la fonction revokeTicket qui prend un objet visiteur, met l'identifiant du billet à null et renvoie ensuite l'objet.
const visitor = {
name: 'Verena Nardi',
age: 45,
ticketId: 'H32AZ123',
};
revokeTicket(visitor);
// => { name: 'Verena Nardi', age: 45, ticketId: null }
Pour éviter la falsification, les identifiants des billets sont uniques. Une fois un billet imprimé, son identifiant est ajouté comme clé dans un objet du système afin de pouvoir le suivre.
Avant d'être vendu à un visiteur, le billet est enregistré avec la valeur null dans l'objet de suivi des billets.
Lorsqu'il est vendu à un visiteur, le nom du visiteur est affecté comme valeur.
Quand les employés doutent de la validité d'un billet, ils doivent vérifier l'état du billet dans le système.
Implémente une fonction ticketStatus qui prend l'objet de suivi et un identifiant de billet comme arguments.
Elle doit renvoyer l'un des résultats suivants.
'unknown ticket id' si l'identifiant n'a pas été trouvé dans l'objet de suivi'not sold' si le billet a été imprimé mais pas vendu'sold to {name}' où {name} est le nom du visiteur si le billet a été venduconst tickets = {
'0H2AZ123': null,
'23LA9T41': 'Verena Nardi',
};
ticketStatus(tickets, 'RE90VAW7');
// => 'unknown ticket id'
ticketStatus(tickets, '0H2AZ123');
// => 'not sold'
ticketStatus(tickets, '23LA9T41');
// => 'sold to Verena Nardi'
Au bout d'un moment, les employés te font remarquer qu'ils veulent que l'état du billet soit plus facile à comprendre au premier coup d'œil. Ils veulent seulement voir soit le nom du visiteur, soit que le billet est invalide.
Écris une fonction simpleTicketStatus qui prend les mêmes arguments que ticketStatus dans la tâche 3.
Cette fonction ne renvoie que l'un de ces deux résultats.
'invalid ticket !!!' si le billet n'a pas encore été vendu ou si l'identifiant n'a pas été trouvé dans l'objet de suiviconst tickets = {
'0H2AZ123': null,
'23LA9T41': 'Verena Nardi',
};
simpleTicketStatus(tickets, '23LA9T41');
// => 'Verena Nardi'
simpleTicketStatus(tickets, '0H2AZ123');
// => 'invalid ticket !!!'
simpleTicketStatus(tickets, 'RE90VAW7');
// => 'invalid ticket !!!'
En raison de nouvelles exigences légales, les objets visiteurs créés récemment contiennent désormais aussi des informations détaillées sur les « conditions générales » (CG) que l'utilisateur a acceptées. Tu peux voir ci-dessous un exemple du nouvel objet visiteur.
Les caissiers du parc d'attractions doivent désormais vérifier si un visiteur doit signer une nouvelle version des CG.
Pour cela, implémente une fonction gtcVersion qui prend un objet visiteur comme argument et renvoie la version des CG si elle est disponible.
Si l'information de version n'est pas disponible, rien ne doit être renvoyé.
const visitorNew = {
name: 'Verena Nardi',
age: 45,
ticketId: 'H32AZ123',
gtc: {
signed: true,
version: '2.1',
},
};
gtcVersion(visitorNew);
// => '2.1'
const visitorOld = {
name: 'Verena Nardi',
age: 45,
ticketId: 'H32AZ123',
};
gtcVersion(visitorOld);
// => undefined
Inscris-toi sur Exercism pour apprendre et maîtriser JavaScript avec 37 concepts159 exercices, et un vrai mentorat humain, le tout gratuitement.