undefined
=========

La propriété globale **`undefined`** représente la valeur primitive `undefined`. Cette valeur est l'un des types primitifs de JavaScript.

| Attributs de `undefined` |
| --- |
| Écrivable | Non |
| Énumérable | Non |
| Configurable | Non |

Exemple interactif
------------------

Syntaxe
-------


```js
undefined;
```

Description
-----------

`undefined` est une propriété de *l'objet global*, c'est-à-dire qu'elle est accessible globalement. La valeur initiale d'`undefined` est la valeur primitive `undefined`.

Dans les navigateurs modernes (JavaScript 1.8.5 / Firefox 4+), d'après la spécification ECMAScript 5, `undefined` est une propriété non-configurable et non accessible en écriture. Si, toutefois, elle peut être modifiée dans l'environnement utilisé, il faut éviter de l'écraser.

Une variable pour laquelle aucune valeur n'a été assignée sera de type `undefined`. Une méthode ou instruction renvoie également `undefined` si la variable à évaluer n'a pas de valeur assignée. Une fonction renvoie `undefined` si aucune valeur n'a été renvoyée.

**Attention :** Puisque `undefined` n'est pas un mot réservé du langage JavaScript, il peut être utilisé comme identifiant (nom de variable) dans toute portée autre que la portée globale. Ceci est une très mauvaise idée pour la lisibilité du code et sa maintenabilité.


```js
// À NE PAS FAIRE

// affiche "toto string" dans la console
(function () {
  const undefined = "toto";
  console.log(undefined, typeof undefined);
})();

// affiche "toto string" dans la console
(function (undefined) {
  console.log(undefined, typeof undefined);
})("toto");
```


Exemples
--------

### L'égalité stricte et `undefined`

Il est possible d'utiliser `undefined` et les opérateurs stricts pour l'égalité et l'inégalité strictes afin de déterminer si une variable a une valeur affectée. Dans le code qui suit, la variable `x` n'est pas initialisée et la première instruction `if` sera évaluée à `true` (vrai).


```js
let x;
if (x === undefined) {
  // ces instructions seront exécutées
} else {
  // ces instructions ne seront pas exécutées
}
```


**Note :** L'opérateur d'égalité stricte doit être utilisé ici plutôt que l'opérateur *d'égalité simple*. En effet, `x == undefined` vérifie également si `x` vaut `null`, tandis que l'égalité stricte ne le fait pas. `null` n'est pas équivalent à `undefined`.

Voir la page sur les opérateurs de comparaison pour plus de détails.

### L'opérateur `typeof` et `undefined`

L'opérateur `typeof` peut également être utilisé :


```js
let x;
if (typeof x === "undefined") {
  // ces instructions seront exécutées
}
```


Une des raisons pour utiliser l'opérateur `typeof` est qu'il ne renverra pas d'erreur si la variable n'a pas été définie :


```js
// x n'a pas encore été défini
if (typeof x === "undefined") {
  // donnera true sans erreur
  // ces instructions seront exécutées
}

if (x === undefined) {
  // déclenche une ReferenceError
}
```


Il existe toutefois une autre alternative. Puisque JavaScript utilise la portée statique, on saura qu'une variable a été déclarée si elle est définie dans un contexte englobant.

La portée globale est rattachée à l'objet global, alors on peut vérifier l'existence d'une variable dans le contexte global en examinant la présence d'une propriété sur *l'objet global* via l'opérateur `in`. Par exemple :


```js
if ("x" in window) {
  // ces instructions seront exécutées uniquement
  // si x est défini dans la portée globale
}
```

### L'opérateur `void` et `undefined`

L'opérateur `void` est une troisième solution.


```js
let x;
if (x === void 0) {
  // ces instructions seront exécutées
}

// y n'a pas été défini avant
if (y === void 0) {
  // déclenche une Uncaught ReferenceError: y is not defined
}
```

Spécifications
--------------

| Specification |
| --- |
| ECMAScript Language Specification # sec-undefined |

Compatibilité des navigateurs
-----------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Voir aussi
----------

* Les valeurs primitives de JavaScript
* `null`