Cette page a été traduite à partir de l'anglais par la communauté.Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.
L'opérateur typeof
Baseline Widely available
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis juillet 2015.
L'opérateurtypeof renvoie une chaîne qui indique le type de son opérande.
Dans cet article
Exemple interactif
console.log(typeof 42);// Expected output: "number"console.log(typeof "blubber");// Expected output: "string"console.log(typeof true);// Expected output: "boolean"console.log(typeof undeclaredVariable);// Expected output: "undefined"Syntaxe
L'opérateurtypeof est suivi de son opérande :
typeof operande;typeof operande;Paramètre
Description
Le tableau qui suit liste les résultats possibles de l'opérateurtypeof. Pour plus d'informations sur les types et valeurs primitives en JavaScript, voir la page surles types et structures de données JavaScript.
| Type | Résultat |
|---|---|
| indéfini | "undefined" |
| nul | "object" (voir ci-après) |
| booléen | "boolean" |
| nombre | "number" |
| grand entier (nouveauté d'ECMAScript 2020) | "bigint" |
| chaîne de caractère | "string" |
| symbole (nouveauté d'ECMAScript 6 / 2015) | "symbol" |
| objet Function (au sens ECMA-262, un objet qui implémente [[Call]]) | "function" |
| Tout autre objet | "object" |
Exemples
>Usage simple
// Pour les nombrestypeof 37 === "number";typeof 3.14 === "number";typeof 42 === "number";typeof Math.LN2 === "number";typeof Infinity === "number";typeof NaN === "number"; // Bien que littéralement ce soit "Not-A-Number"…typeof Number("1") === "number"; // Number essaie de convertir l'argument en nombretypeof Number("chaussure") === "number"; // cela vaut également pour les valeurs qui ne peuvent pas être converties// Grand entiertypeof 42n === "bigint";// Les chaînes de caractèrestypeof "" === "string";typeof "bla" === "string";typeof `gabarit de chaîne` === "string";typeof "1" === "string"; // on a ici un nombre écrit sous forme d'une chaînetypeof typeof 1 === "string"; // typeof renvoie toujours une chaînetypeof String(1) === "string"; // String convertit n'importe quelle valeur en chaîne// Les booléenstypeof true === "boolean";typeof false === "boolean";typeof Boolean(1) === "boolean"; // Boolean convertit n'importe quelle valeur en son équivalent logiquetypeof !!1 === "boolean"; // deux appels à l'opérateur ! (le NON logique) sont équivalents à Boolean()// Les symbolestypeof Symbol() === "symbol";typeof Symbol("toto") === "symbol";typeof Symbol.iterator === "symbol";// Indéfinitypeof undefined === "undefined";typeof variableDeclareeMaisIndefinie === "undefined";typeof variableNonDeclaree === "undefined";// Les objetstypeof { a: 1 } === "object";// Utiliser la méthode Array.isArray ou Object.prototype.toString.call// afin de différencier les objets des tableauxtypeof [1, 2, 4] === "object";typeof new Date() === "object";typeof /regex/ === "object"; // Voir la section sur les expressions rationnelles// Les expressions suivantes sont source de confusion// à ne pas utiliser sous cette formetypeof new Boolean(true) === "object";typeof new Number(1) === "object";typeof new String("abc") === "object";// Les fonctionstypeof function () {} === "function";typeof class C {} === "function";typeof Math.sin === "function";typeof null
// Cela est valable depuis les commencements de JavaScripttypeof null === "object";Lors de la première implémentation de JavaScript, les valeurs JavaScript étaient représentées avec une étiquette de type et une valeur. Pour les objets, l'étiquette de type était 0.null était représenté par la valeur NULL (0x00 pour la plupart des plates-formes). Par conséquent, l'étiquette de type denull valait 0, d'où le comportement detypeof (source).
Un correctif fut proposé pour ECMAScript, mais il futrefusé. Avec cette version, on aurait eutypeof null === 'null'.
Utiliser l'opérateurnew
// Tous les constructeurs doivent être employés// avec le mot-clé "new"let maChaine = new String("toto");let monNombre = new Number(100);typeof maChaine; // renverra "object"typeof monNombre; // renverra "object"// En revanche avec le constructeur Function,// on aura :let maFonction = new Function();typeof maFonction; // renverra "function"Utilisation des parenthèses
// Les parenthèses peuvent s'avérer utile pour// déterminer le type de données d'une expression// complètelet maDonnee = 99;typeof maDonnee + " Toto"; // renverra 'number Toto'typeof (maDonnee + " Toto"); // renverra 'string'Expressions rationnelles
Les expressions rationnelles qu'on peut appeler directement furent parfois ajoutées de façon non standard dans certains navigateurs.
typeof /s/ === "function"; // Chrome 1 à 12 : Non conforme à ECMAScript 5.1typeof /s/ === "object"; // À partir de Firefox 5 : Conforme à ECMAScript 5.1Erreurs et zone morte temporaire (Temporal Dead Zone / TDZ)
Avant ECMAScript 2015 (ES6),typeof retournait toujours une chaîne de caractères, quel que soit l'opérande utilisé. On ne pouvait pas avoir d'erreur en utilisanttypeof.
Avec l'apparition des opérateurslet etconst, si on utilisetypeof sur des variables déclarées avec ces opérateurs (ou avec une classe) avant leur déclaration, cela déclenchera une erreurReferenceError. Si on utilisetypeof sur une variable déclarée avecvar avant la déclaration, cela renverraundefined. Les variables déclarées aveclet etconst sont en fait placées dans unezone morte temporaire entre le début du bloc et leur initialisation et dans cette zone, tout accès à la variable produit une erreur.
typeof variableGlobaleNonDeclaree === "undefined";typeof variableLet; // ReferenceErrorlet variableLet;typeof constante; // ReferenceErrorconst constante = "coucou";typeof maClasse; // ReferenceErrorclass maClasse {}Exceptions
Tous les navigateurs actuels exposent un objet non-standarddocument.all dont le type estundefined.
typeof document.all === "undefined";Bien que la spécification requière que les objets exotiques aient des types différents, ces types doivent être des chaînes différentes des chaînes existantes pour les objets standards. À ce titre, le type dedocument.all représente une violation « volontaire » du standard ECMAScript original.
Spécifications
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-typeof-operator> |
Compatibilité des navigateurs
Notes spécifiques à IE
Pour les versions 6, 7 et 8 d'Internet Explorer, les objets de l'environnement hôte sont des objets et non des fonctions. Par exemple, on aura :
typeof alert === "object";Certaines propriétés non-standard d'IE renvoient d'autres valeurs (tc39/ecma262#1440(commentaire)):
typeof window.external.AddSearchProvider === "unknown";typeof window.external.IsSearchProviderInstalled === "unknown";