Menu
Français

Types primitifs en JavaScript : les 7 valeurs de base

Les sept types primitifs de JavaScript — string, number, bigint, boolean, null, undefined et symbol — et ce qui les distingue des objets.

Sept primitifs, et tout le reste

En JavaScript, les valeurs se répartissent en deux camps. D'un côté, sept types primitifs : des valeurs simples et immuables. De l'autre, les objets : tout ce qui est composite, modifiable ou appelable. Voilà, c'est tout le système de types au niveau des valeurs.

Les sept types primitifs javascript :

index.js
Output
Click Run to see the output here.

Tout ce qui ne figure pas dans cette liste — tableaux, fonctions, dates, expressions régulières, ou un simple {} — est un objet. typeof te renvoie le type à l'exécution, et tu vas vite repérer la fameuse bizarrerie sur la dernière ligne. typeof null renvoie 'object' depuis 1995, et ça ne sera jamais corrigé : trop de code existant s'appuie là-dessus.

Un type primitif, c'est une valeur, pas un conteneur

Le modèle mental qui aide le plus : un primitif est sa valeur. Le nombre 3 n'est pas une boîte qui contient 3 — c'est juste 3. Deux variables qui valent 3 contiennent la même valeur, pas deux copies pointant vers quelque chose de partagé :

index.js
Output
Click Run to see the output here.

Les primitifs se comparent par valeur. Les objets, eux, se comparent par référence. Cette distinction à elle seule explique pas mal de moments « mais pourquoi ça renvoie false ?! » plus tard, surtout quand on compare des tableaux ou des objets avec ===.

Les valeurs immuables en JavaScript

Un primitif ne se modifie pas. Chaque opération qui ressemble à une mutation produit en réalité une nouvelle valeur :

index.js
Output
Click Run to see the output here.

Le premier appel crée une nouvelle chaîne puis la jette à la poubelle, parce que personne ne récupère la valeur de retour. Le second, lui, réassigne name. Le "ada" d'origine n'a jamais été modifié — et c'était tout simplement impossible. Pareil pour les nombres : x + 1 produit un nouveau nombre, ça ne modifie pas x.

C'est pour ça que const sur une chaîne ou un nombre est vraiment fiable. La valeur ne peut pas changer, et const t'empêche de réassigner la variable.

Number et BigInt : pourquoi deux types numériques en JavaScript ?

En JavaScript, le type number est un flottant 64 bits. Résultat : des calculs rapides, mais un plafond — les entiers ne sont exacts que jusqu'à Number.MAX_SAFE_INTEGER (2^53 - 1) :

index.js
Output
Click Run to see the output here.

Au-delà de ce seuil, les entiers commencent à se marcher dessus. Le type bigint est là pour les entiers qui doivent rester exacts quelle que soit leur taille. On en crée un en ajoutant le suffixe n :

index.js
Output
Click Run to see the output here.

bigint et number ne se mélangent pas dans les opérations arithmétiques — sinon tu perdrais tout l'intérêt de la précision supplémentaire. On sort le bigint pour les IDs de base de données, les timestamps en nanosecondes ou la crypto. Pour le calcul de tous les jours, on reste sur number.

Les chaînes aussi sont des primitifs

En JavaScript, une chaîne de caractères est un type primitif, pas un objet — même si elle expose des méthodes comme .length, .slice ou .toUpperCase :

index.js
Output
Click Run to see the output here.

En coulisses, quand vous appelez une méthode sur une chaîne, JavaScript l'enveloppe brièvement dans un objet String pour que l'appel fonctionne, puis se débarrasse de l'emballage. Pas besoin de vous préoccuper de ce wrapper — retenez simplement que les chaînes se comportent comme des valeurs (immuables, comparées par valeur), même si elles exposent tout un tas de méthodes.

Les guillemets simples, les guillemets doubles et les backticks produisent tous le même type. Les backticks offrent en plus l'interpolation et les chaînes multilignes, un sujet traité dans le prochain document.

null et undefined : quelle différence en javascript

Deux types primitifs expriment l'idée « aucune valeur », et ils ne sont pas interchangeables.

undefined, c'est ce que vous obtenez quand rien n'a été assigné — une variable déclarée mais non initialisée, un argument de fonction manquant, une propriété qui n'existe pas :

index.js
Output
Click Run to see the output here.

null, c'est ce que vous écrivez vous-même pour indiquer « volontairement vide » :

index.js
Output
Click Run to see the output here.

La convention habituelle : undefined, c'est la façon qu'a le langage de dire « il n'y a rien ici », alors que null est la façon qu'a le développeur de l'exprimer. Les deux sont falsy, les deux échouent à l'égalité avec des valeurs normales, et chacun aura droit à sa propre page plus loin.

Les symbols : uniques par construction

symbol est le type primitif le moins utilisé. Chaque symbol que tu crées est unique, même si deux d'entre eux partagent la même description :

index.js
Output
Click Run to see the output here.

Les Symbol sont pratiques comme clés d'objet qui ne peuvent entrer en collision avec d'autres : une bibliothèque peut attacher des métadonnées à tes objets via un symbole, avec la certitude qu'aucun autre code ne viendra les écraser. Tu les recroiseras du côté des itérateurs et des symboles bien connus comme Symbol.iterator.

Vérifier les types à l'exécution avec typeof

typeof couvre la plupart des cas. Garde simplement ces petites bizarreries en tête :

index.js
Output
Click Run to see the output here.

Pour null, on compare directement : value === null. Pour les tableaux, on utilise Array.isArray(value). Pour répondre à « est-ce une primitive, peu importe laquelle ? », il n'existe pas de méthode native unique, mais l'idiome reste assez parlant :

index.js
Output
Click Run to see the output here.

Primitives vs objets : le piège de l'affectation

Avant de passer à la suite, il y a un dernier point à bien voir. Comme les primitives sont des valeurs alors que les objets sont des références, l'affectation ne se comporte pas de la même façon :

index.js
Output
Click Run to see the output here.

Avec les types primitifs, b = a copie la valeur. Avec les objets, y = x copie la référence — les deux noms pointent vers le même objet sous-jacent. Muter via l'un affecte l'autre. C'est la première source de bugs du genre « attends, pourquoi ça a changé ? » en JavaScript.

Ce qu'il faut retenir

  • Sept types primitifs : string, number, bigint, boolean, null, undefined, symbol. Tout le reste est un objet.
  • Les primitifs sont immuables et comparés par valeur ; les objets sont mutables et comparés par référence.
  • typeof renvoie le type à l'exécution, avec deux bizarreries à garder en tête : typeof null === "object" et typeof function === "function".
  • number est un flottant 64 bits avec un plafond de sécurité pour les entiers ; bigint existe pour représenter des entiers exacts au-delà de ce plafond.

La suite : chaînes et littéraux de gabarit

Les chaînes sont le type primitif que tu manipuleras le plus, et les littéraux de gabarit (ces chaînes entre backticks) rendent leur construction indolore : interpolation, texte multi-ligne, gabarits étiquetés. C'est au programme de la prochaine page.

Questions fréquentes

Combien de types primitifs existe-t-il en JavaScript ?

Sept : string, number, bigint, boolean, null, undefined et symbol. Tout le reste — tableaux, fonctions, dates, objets classiques — est un objet. Pour connaître le type d'une valeur à l'exécution, on utilise typeof, avec la bizarrerie historique bien connue : typeof null renvoie 'object'.

Quelle est la différence entre un primitif et un objet en JavaScript ?

Les primitifs sont des valeurs immuables comparées par valeur : deux 3 sont strictement le même 3. Les objets, eux, sont mutables et comparés par référence : deux {} sont distincts même s'ils paraissent identiques. Quand on affecte un primitif, on copie la valeur ; quand on affecte un objet, on copie la référence vers la même donnée sous-jacente.

Les primitifs JavaScript sont-ils vraiment immuables ?

Oui. Impossible de modifier un primitif sur place — 'hello'.toUpperCase() renvoie une nouvelle chaîne, l'originale reste intacte. Réaffecter une variable (x = x + 1) remplace simplement sa valeur par un autre primitif ; la valeur d'origine, elle, n'est jamais touchée. C'est pour ça qu'avec const name = 'Ada', on peut encore construire de nouvelles chaînes à partir de name.

Pourquoi typeof null renvoie-t-il 'object' ?

C'est un bug de l'implémentation d'origine en 1995, jamais corrigé parce que trop de code s'appuyait déjà dessus. Pour tester si une valeur vaut null, on utilise === : value === null. Pour undefined, on écrit value === undefined ou typeof value === 'undefined'.

Apprendre à coder avec Coddy

COMMENCER