JavaScript - Chaînage Optionnel

Salut à toi, futurs magiciens JavaScript ! ? Aujourd'hui, nous allons entreprendre un voyage passionnant à la découverte du monde du Chaînage Optionnel. Ne t'inquiète pas si tu es nouveau dans le monde de la programmation - je serai ton guide amical, et nous avancerons pas à pas. À la fin de cette leçon, tu chaîneras comme un pro ! C'est parti !

JavaScript - Optional Chaining

Le Problème de la Propriété Inexistante

Imagine que tu essaies de trouver un livre dans une bibliothèque massive. Tu sais qu'il devrait être dans la section "Science Fiction", au troisième étage, dans le coin arrière. Mais que se passe-t-il si la bibliothèque n'a même pas de troisième étage ? Ou si il n'y a pas de section "Science Fiction" ? C'est ce genre de problème que nous rencontrons souvent en JavaScript lors de la manipulation d'objets imbriqués.

Regardons un exemple :

const library = {
fiction: {
fantasy: {
books: ['The Hobbit', 'Harry Potter']
}
}
};

console.log(library.fiction.sciFi.books);

Si tu exécutes ce code, tu obtiendras une erreur : "Cannot read property 'books' of undefined". Pourquoi ? Parce que library.fiction.sciFi n'existe pas ! C'est là que le Chaînage Optionnel entre en jeu.

Qu'est-ce que le Chaînage Optionnel en JavaScript ?

Le Chaînage Optionnel est comme un filet de sécurité pour ton code. Il te permet d'accéder aux propriétés imbriquées d'un objet sans t'inquiéter si les propriétés intermédiaires existent. Il est représenté par l'opérateur ?..

Reprenons notre exemple précédent avec le Chaînage Optionnel :

const library = {
fiction: {
fantasy: {
books: ['The Hobbit', 'Harry Potter']
}
}
};

console.log(library.fiction.sciFi?.books);

Au lieu de lancer une erreur, cela renverra simplement undefined. C'est comme demander : "Si sciFi existe, peux-tu me donner ses books ? Si non, pas de souci !"

Chaînage Optionnel avec des Appels de Fonction

Le Chaînage Optionnel n'est pas seulement pour les propriétés d'objet. Tu peux l'utiliser avec des appels de fonction également ! Imaginons que nous avons un système de bibliothèque où les livres peuvent être empruntés :

const library = {
fiction: {
fantasy: {
checkOut: function(book) {
console.log(`Checking out ${book}`);
}
}
}
};

library.fiction.fantasy.checkOut?.('The Hobbit');
library.fiction.sciFi?.checkOut?.('Dune');

Dans cet exemple, 'The Hobbit' sera emprunté, mais rien ne se passera avec 'Dune' parce que sciFi n'existe pas. Pas d'erreurs, juste un voyage en douceur !

Chaînage Optionnel avec une Expression

Tu peux également utiliser le Chaînage Optionnel avec la notation entre crochets. Cela est utile lorsque tes noms de propriétés sont dynamiques ou contiennent des caractères spéciaux :

const users = {
'123': { name: 'Alice', age: 30 },
'456': { name: 'Bob', age: 25 }
};

const userId = '789';
console.log(users[userId]?.name);

Cela renverra undefined parce qu'il n'y a pas d'utilisateur avec l'ID '789', mais il ne lancera pas d'erreur.

Chaînage Optionnel avec l'Opérateur "delete"

L'opérateur delete peut également être utilisé avec le Chaînage Optionnel. C'est pratique lorsque tu veux supprimer une propriété qui pourrait ne pas exister :

const obj = {
prop: {
innerProp: 'value'
}
};

delete obj.prop?.innerProp;
delete obj.nonExistent?.prop;

La première suppression fonctionnera comme prévu, enlevera innerProp. La seconde ne fera rien, mais ne lancera pas d'erreur.

Court-circuit avec le Chaînage Optionnel

Le Chaînage Optionnel a une fonctionnalité sympa appelée court-circuit. Si la partie gauche du ?. est null ou undefined, l'évaluation s'arrête et renvoie undefined :

const obj = null;
console.log(obj?.prop?.subProp);  // Renvoie undefined

Cela est super utile pour éviter ces erreurs embêtantes "Cannot read property of null" !

Opérateur de Coalescence Nul avec le Chaînage Optionnel

L'Opérateur de Coalescence Nul (??) fonctionne très bien avec le Chaînage Optionnel. Il te permet de fournir une valeur par défaut si le résultat du Chaînage Optionnel est null ou undefined :

const user = {
name: 'Alice',
details: {
age: 30
}
};

console.log(user.details?.job ?? 'unemployed');  // Renvoie 'unemployed'
console.log(user.details?.age ?? 'unknown');     // Renvoie 30

C'est parfait pour fournir des valeurs de secours lorsque des propriétés pourraient ne pas exister.

Voici un tableau récapitulatif des méthodes que nous avons couvertes :

Méthode Syntaxe Description
Accès à la Propriété obj?.prop Accéder en toute sécurité aux propriétés imbriquées d'un objet
Appel de Fonction func?.() Appeler en toute sécurité une fonction qui pourrait ne pas exister
Expression obj?.[expr] Accéder en toute sécurité aux propriétés avec des noms dynamiques ou spéciaux
Opérateur "delete" delete obj?.prop Supprimer en toute sécurité une propriété qui pourrait ne pas exister
Court-circuit obj?.prop?.subProp Arrête l'évaluation si une partie est null ou undefined
Avec l'Opérateur de Coalescence Nul obj?.prop ?? defaultValue Fournir une valeur par défaut pour les résultats null ou undefined

Et voilà, les amis ! Tu viens de monter en niveau tes compétences JavaScript avec le Chaînage Optionnel. Souviens-toi, coder c'est comme construire avec des LEGO - commence par les bases, et avant de t'en rendre compte, tu seras en train de créer des œuvres d'art. Continue à pratiquer, reste curieux, et bon codage ! ??‍??‍?

Credits: Image by storyset