?.

L’opérateur ?. (optional chaining) lit une propriété de façon sûre. Quand l’objet est null ou undefined, il renvoie undefined au lieu d’une erreur.

Renvoie
La valeur de la propriété ou le résultat de l’appel, ou undefined quand la valeur avant ?. est null ou undefined.
Sur cette page

Exemple

#
JavaScript
const léa = { name: 'Léa', address: { city: 'Paris' } }
const guest = { name: 'Invité' }

console.log(léa.address?.city)
console.log(guest.address?.city)
Console
Paris
undefined

Définition et utilisation

#

L’opérateur ?. vérifie la valeur à sa gauche. Si c’est null ou undefined, toute l’expression donne immédiatement le résultat undefined. Sinon, il fonctionne comme un point normal.

Il résout un problème fréquent avec des données qui peuvent être incomplètes, par ex. une réponse d’API. Au lieu de user && user.address && user.address.city, il suffit d’écrire user?.address?.city. Il fonctionne aussi avec les crochets obj?.[key] et avec l’appel de fonction callback?.(), qui n’exécute la fonction que si elle existe.

L’opérateur interrompt l’évaluation de toute la chaîne : si user est null, la suite de l’expression user?.profile.name ne s’exécute pas du tout. Vous ne pouvez pas l’utiliser à gauche d’une affectation, et lire une variable non déclarée lèvera toujours une ReferenceError.

Syntaxe

#
Syntaxe
object?.property
object?.[expression]
function?.(args)

Plus d’exemples

#
Appeler une fonction optionnelle
JavaScript
function finishLesson(onFinish) {
  console.log('Leçon terminée')
  onFinish?.('15 EXP obtenus')
}

finishLesson((message) => console.log(message))
finishLesson()
Console
Leçon terminée
15 EXP obtenus
Leçon terminée
Indice de tableau et valeur de repli
JavaScript
const response = { data: { students: [] } }

const firstName = response.data?.students?.[0]?.name ?? 'Aucun élève'
console.log(firstName)
Console
Aucun élève
Interrompre toute la chaîne
JavaScript
const user = null

console.log(user?.profile.nickname.toUpperCase())
Console
undefined

Quand user est null, le reste de la chaîne n’est pas évalué, donc l’absence de ?. devant profile ne cause pas d’erreur. Mais si user était un objet sans profile, lire .nickname lèverait une TypeError.

Compatibilité des navigateurs

#

Largement disponible

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • Ne mettez pas ?. partout « au cas où ». Utilisez-le là où l’absence de valeur est normale. Si un objet devrait toujours exister, une erreur aidera à trouver le problème plus vite.
  • Combinez ?. avec ?? pour fournir immédiatement une valeur de repli : user?.nickname ?? "Anonyme".
  • ?. ne réagit qu’à null et undefined. Une chaîne vide, 0 ou false sont traités comme des valeurs normales.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.