[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Data_structures#conversion_de_primitive [Back]  [Original]

Types et structures de donnes JavaScript - JavaScript | MDN

Cette page a t traduite partir de l'anglais par la communaut. Vous pouvez contribuer en rejoignant la communaut francophone sur MDN Web Docs.

View in English Always switch to English

Types et structures de donnes JavaScript

Les langages de programmation disposent de structures de donnes natives. Selon les langages, les structures mises disposition peuvent tre diffrentes. Dans cet article, on listera les structures de donnes natives en JavaScript. On dtaillera leurs proprits et les faons de les utiliser voire de les combiner. Dans certains cas, on comparera ces structures avec celles d'autres langages.

Dans cet article

Un typage dynamique

JavaScript est un langage dont le typage est faible et dynamique. Cela signifie qu'il n'est pas ncessaire de dclarer le type d'une variable avant de l'utiliser. Le type de la variable sera automatiquement dtermin lorsque le programme sera excut. Cela signifie galement que la mme variable pourra avoir diffrents types au cours de son existence :

js
let toto = 42; // toto est un nombre
toto = "truc"; // toto est dsormais une chane de caractres
toto = true; // toto est dsormais un boolen

Les types de donnes JavaScript

L'ensemble des types disponible en JavaScript se compose des valeurs primitives et des objets.

Les valeurs primitives

Tous les types, sauf les objets, dfinissent des valeurs immuables (qu'on ne peut modifier). Ainsi, contrairement au C, les chanes de caractres sont immuables en JavaScript. Les valeurs immuables pour chacun de ces types sont appeles  valeurs primitives .

Le type boolen

Un boolen reprsente le rsultat d'une assertion logique et peut avoir deux valeurs : true (pour le vrai logique) et false (pour le faux logique) (voir Boolean pour plus de dtails sur la reprsentation objet de ce type).

Le type nul

Le type nul ne possde qu'une valeur : null. Voir null et la page du glossaire pour plus d'informations.

Le type indfini

Une variable laquelle on n'a pas affect de valeur vaudra undefined. Voir undefined et la page du glossaire pour plus d'informations.

Les types numriques

ECMAScript possde deux types numriques natifs : Number et BigInt, ainsi que la valeur spciale NaN.

Le type nombre

Le type Number est gr pour reprsenter les nombres : les nombres flottants prcision double, reprsents sur 64 bits, selon le format IEEE 754. Cette reprsentation permet de stocker des nombres dcimaux entre 2^-1074 et 2^1024, mais ne permet de reprsenter des entiers de faon sre qu'au sein de l'intervalle allant de -(2^53 1) 2^53 1. Les valeurs en dehors de l'intervalle compris entre Number.MIN_VALUE et Number.MAX_VALUE sont automatiquement converties en +Infinity ou -Infinity, qui se comporteront de faon analogue l'infini mathmatique (voir la page sur Number.POSITIVE_INFINITY pour les dtails et les quelques diffrences).

Note : Vous pouvez vrifier si un nombre est un nombre entier reprsentable de faon exacte avec une reprsentation en nombre flottant double prcision avec la mthode Number.isSafeInteger(). En dehors de l'intervalle entre Number.MIN_SAFE_INTEGER et Number.MAX_SAFE_INTEGER, JavaScript ne peut plus reprsenter un entier de faon exacte et ce sera une approximation avec un nombre flottant double prcision.

Pour le type Number, il n'y a qu'un seul nombre qui possde plusieurs reprsentations : 0 qui est reprsent comme -0 et +0 (avec 0 tant un synonyme pour +0). En pratique, il n'y a presque pas de diffrences entre ces reprsentations et +0 === -0 vaut true. Toutefois, on pourra remarquer la nuance lors de la division par zro :

js
> 42 / +0
Infinity
> 42 / -0
-Infinity

Dans la plupart des cas, un nombre reprsente sa propre valeur et JavaScript fournit des oprateurs binaires.

Note : Bien que les oprateurs binaires puissent tre utiliss afin de reprsenter plusieurs valeurs boolennes avec un seul nombre en utilisant un masque de bits, c'est gnralement une mauvaise pratique. En effet, JavaScript fournit d'autres moyens pour reprsenter un ensemble de valeurs boolennes comme les tableaux ou l'utilisation de proprits nommes pour stocker ces valeurs. L'utilisation d'un masque de bit dgrade galement la lisibilit, la clart et la maintenabilit du code.

Il peut tre ncessaire d'utiliser de telles techniques dans des environnements extrmement contraints, pour grer des limites de stockage local ou lorsque chaque bit transmis sur le rseau compte. Cette technique devrait uniquement tre considre comme dernire mesure pour rduire la taille.

Le type BigInt

Le type BigInt est un type numrique qui permet de reprsenter des entiers avec une prcision arbitraire. Avec ce type, on peut donc manipuler des entiers plus grands que ceux reprsentables avec Number.

Pour crer un grand entier, on ajoutera un n aprs l'entier ou on appellera le constructeur BigInt.

On peut connatre la valeur la plus grande qui peut tre incrmente et reprsente avec le type Number en utilisant la constante Number.MAX_SAFE_INTEGER. Avec les grands entiers, on peut manipuler des nombres qui vont au-del de Number.MAX_SAFE_INTEGER.

Dans l'exemple qui suit, on voit le rsultat obtenu lorsqu'on incrmente la valeur de Number.MAX_SAFE_INTEGER :

js
// BigInt
> const x = BigInt(Number.MAX_SAFE_INTEGER);
9007199254740991n
> x + 1n === x + 2n; // 9007199254740992n === 9007199254740993n
false

// Number
> Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // 9007199254740992 === 9007199254740992
true

l'instar des nombres classiques, on peut utiliser les oprateurs +, *, -, ** et %. Un grand entier ne sera pas strictement gal un nombre mais on pourra avoir une galit faible.

Un grand entier se comportera comme un nombre lorsqu'il est converti en boolen avec if, ||, &&, Boolean et !.

Il n'est pas possible d'utiliser des grands entiers et des nombres de faon interchangeable. Une exception TypeError sera dclenche en cas d'incompatibilit.

NaN

NaN (pour Not A Number en anglais, qui signifie  qui n'est pas un nombre ) est utilise lorsque le rsultat d'une opration arithmtique ne peut pas tre exprime comme un nombre. Il s'agit galement de la seule valeur JavaScript qui n'est pas gale elle-mme (du fait de la norme IEEE 754).

Le type chane de caractres (String)

Ce type JavaScript est utilis afin de reprsenter des donnes de texte. C'est un ensemble d' lments  de valeurs entires non-signes reprsentes sur 16 bits. Chaque lment occupe une position au sein de cette chane de caractres. Le premier lment est situ l'indice 0, le deuxime l'indice 1 et ainsi de suite. La longueur d'une chane de caractres correspond au nombre d'lments qu'elle contient.

la diffrence d'autres langages (comme le C), les chanes de caractres JavaScript sont immuables. Cela signifie qu'une fois une chane cre, il est impossible de la modifier.

En revanche, il est toujours possible de crer une autre chane base sur la premire grce des oprations. Par exemple :

  • Un fragment de la chane originelle en slectionnant certaines lettres ou en utilisant String.substr().
  • Une concatnation de deux chanes de caractres en utilisant l'oprateur de concatnation (+) ou String.concat().

Attention ne pas utiliser les chanes pour tout et n'importe quoi !

a peut tre tentant de vouloir utiliser des chanes afin de reprsenter des donnes complexes. En revanche, les avantages de cette mthode ne sont que trs superficiels :

  • On peut facilement construire des chanes complexes grce la concatnation.
  • On peut dboguer rapidement le contenu des chanes de caractres.
  • Les chanes de caractres sont utilises de multiples endroits dans beaucoup d'API (champs de saisie, valeurs en stockage local, rponses XMLHttpRequest avec responseText, etc.).

En utilisant des conventions, il peut tre possible de reprsenter n'importe quelle donne sous forme d'une chane de caractres, en revanche cela n'est souvent pas la meilleure faon. Par exemple, avec un sparateur, on pourrait muler le comportement d'un tableau en  interdisant  que ce sparateur soit utilis pour lments, etc. On pourrait ensuite dfinir un caractre d'chappement, qui serait son tour inutilisable dans les chanes : toutes ces pseudo-conventions entraneront de lourdes consquences en termes de maintenance.

En rsum, les chanes doivent tre utilises pour les donnes de texte. Pour des donnes plus complexes, utilisez une abstraction adquate et analysez/parsez les chanes que vous recevez d'autres API.

Le type symbole

Un symbole est une valeur primitive unique et immuable pouvant tre utilise comme cl pour proprit d'un objet (voir ci-aprs). Dans d'autres langages de programmation, les symboles sont appels atomes.

Pour plus de dtails, voir les pages du glossaire et de Symbol JavaScript.

Les objets

En informatique, un objet est une valeur conserve en mmoire laquelle on fait rfrence grce un identifiant.

Proprits

En JavaScript, les objets peuvent tre considrs comme des collections de proprits. En utilisant un littral objet, il est possible d'initialiser un ensemble limit de proprits ; d'autres proprits peuvent ensuite tre ajoutes et/ou retires. Les valeurs des proprits peuvent tre de n'importe quel type, y compris des objets. Cela permet de construire des structures de donnes complexes. Les proprits sont identifies grce une  cl . Une cl peut tre une chane de caractres ou un symbole.

Il existe deux types de proprits qui ont certains attributs : des proprits de donnes (data property) et des proprits d'accesseur.

Note : Chaque proprit est dcrite par des attributs correspondants. Ceux-ci sont utiliss par le moteur JavaScript et ne peuvent pas tre manipuls depuis le code. Pour les identifier, les attributs sont indiqus entre double crochets.

Voir la page Object.defineProperty() pour en savoir plus.

Proprits de donnes

Elles associent une cl avec une valeur et possdent les attributs suivants :

Attributs d'une proprit de donne
Attribut Type Description Valeur par dfaut
[[Value]] N'importe quel type JavaScript La valeur obtenue lorsqu'on accde la proprit. undefined
[[Writable]] Boolen Si cet attribut vaut false, l'attribut [[Value]] de la proprit ne pourra pas tre chang. false
[[Enumerable]] Boolen

Si cet attribut vaut true, la proprit sera numre dans les boucles forin. Voir aussi Rattachement et caractre numrable des proprits.

false
[[Configurable]] Boolen Si cet attribut vaut false, la proprit ne peut pas tre supprime, ne peut pas tre change en proprit d'accesseur et les attributs en dehors de [[Value]] et [[Writable]] ne pourront pas tre changs. false
Attribut Type Description
Read-only Boolen tat symtrique pour l'attribut ES5 [[Writable]].
DontEnum Boolen tat symtrique pour l'attribut ES5 [[Enumerable]].
DontDelete Boolen tat symtrique pour l'attribut ES5 [[Configurable]].

Proprits d'accesseur

Ces proprits associent une cl avec une ou deux fonctions accesseur et mutateur (respectivement get et set) qui permettent de rcuprer ou d'enregistrer une valeur.

Note : Il est important de noter qu'on parle de proprit d'accesseur et pas de mthode. On peut donner des accesseurs semblables ceux d'une classe un objet en utilisant une fonction comme valeur d'une proprit mais a ne fait pas de l'objet une classe.

Elles possdent les attributs suivants :

Attribut Type Description Valeur par dfaut
[[Get]] Un objet Function ou undefined La fonction qui est appele sans argument afin de rcuprer la valeur de la proprit quand on souhaite y accder. Voir aussi la page sur get. undefined
[[Set]] Un objet Function ou undefined La fonction, appele avec un argument qui contient la valeur qu'on souhaite affecter la valeur et qui est excute chaque fois qu'on souhaite modifier la valeur. Voir aussi la page sur set. undefined
[[Enumerable]] Boolen S'il vaut true, la proprit sera liste dans les boucles forin. false
[[Configurable]] Boolen S'il vaut false, la proprit ne pourra pas tre supprime et ne pourra pas tre transforme en une proprit de donnes. false

Les objets  normaux  et les fonctions

Un objet JavaScript est un ensemble de correspondances entre des cls et des valeurs. Les cls sont reprsentes par des chanes ou des symboles (Symbol). Les valeurs peuvent tre de n'importe quel type. Grce cela, les objets peuvent, naturellement, tre utiliss comme tables de hachage.

Les fonctions sont des objets classiques la seule diffrence qu'on peut les appeler.

Les dates

Lorsqu'on souhaite reprsenter des dates, il est tout indiqu d'utiliser le type utilitaire natif Date de JavaScript.

Les collections indexes : les tableaux (Arrays) et les tableaux typs (Typed Arrays)

Les tableaux (ou Arrays en anglais) sont des objets natifs qui permettent d'organiser des valeurs numrotes et qui ont une relation particulire avec la proprit length.

De plus, les tableaux hritent de Array.prototype qui permet de bnficier de plusieurs mthodes pour manipuler les tableaux. Par exemple, indexOf() qui permet de rechercher une valeur dans le tableau ou push() qui permet d'ajouter un lment au tableau. Les tableaux sont donc indiqus quand on souhaite reprsenter des listes de valeurs ou d'objets.

Les tableaux typs (Typed Arrays en anglais) ont t ajouts avec ECMAScript 2015 et offrent une vue sous forme d'un tableau pour manipuler des tampons de donnes binaires. Le tableau qui suit illustre les types de donnes quivalents en C :

Type Intervalle Taille (exprime en octets) Description Type Web IDL Type quivalent en C
Int8Array -128 127 1 Entier sign en complment deux sur 8 bits. byte int8_t
Uint8Array 0 255 1 Entier non sign sur 8 bits. octet uint8_t
Uint8ClampedArray 0 255 1 Entier non sign sur 8 bits (compris entre 0 et 255). octet uint8_t
Int16Array -32768 32767 2 Entier sign en complment deux sur 16 bits. short int16_t
Uint16Array 0 65535 2 Entier non sign sur 16 bits. unsigned short uint16_t
Int32Array -2147483648 2147483647 4 Entier sign en complment deux sur 32 bits. long int32_t
Uint32Array 0 4294967295 4 Entier non sign sur 32 bits. unsigned long uint32_t
Float32Array 1.2x10^-38 3.4x10^38 4 Nombre flottant sur 32 bits selon la reprsentation IEEE (7 chiffres significatifs). unrestricted float float
Float64Array 5.0x10^-324 1.8x10^308 8 Nombre flottant sur 64 bits selon la reprsentation IEEE (16 chiffres significatifs). unrestricted double double
BigInt64Array -2^63 2^63-1 8 Nombre entier sign sur 64 bits en complment deux. bigint int64_t (signed long long)
BigUint64Array 0 2^64-1 8 Nombre entier non sign sur 64 bits. bigint uint64_t (unsigned long long)

Les collections avec cls : Map, Set, WeakMap, WeakSet

Ces structures de donnes utilisent des cls pour rfrencer des objets. Elles ont t introduites avec ECMAScript 2015. Set et WeakSet reprsentent des ensembles d'objets, Map et WeakMap associent une valeur un objet.

Il est possible d'numrer les valeurs contenues dans un objet Map mais pas dans un objet WeakMap. Les WeakMap quant eux permettent certaines optimisations dans la gestion de la mmoire et le travail du ramasse-miettes.

Il est possible d'implmenter des objets Map et Set grce ECMAScript 5. Cependant, comme les objets ne peuvent pas tre compars (avec une relation d'ordre par exemple), la complexit obtenue pour rechercher un lment serait ncessairement linaire. Les implmentations natives (y compris celle des WeakMap) permettent d'obtenir des performances logarithmiques voire constantes.

Gnralement, si on voulait lier des donnes un nud DOM, on pouvait utiliser les attributs data-* ou dfinir les proprits un mme l'objet. Malheureusement, cela rendait les donnes disponibles n'importe quel script fonctionnant dans le mme contexte. Les objets Map et WeakMap permettent de grer plus simplement une liaison  prive  entre des donnes et un objet.

Les donnes structures : JSON

JSON (JavaScript Object Notation) est un format d'change de donnes lger, driv de JavaScript et utilis par plusieurs langages de programmation. JSON permet ainsi de construire des structures de donnes universelles pouvant tre changes entre programmes.

Pour plus d'informations, voir la page du glossaire et la page sur JSON.

Les autres objets de la bibliothque standard

JavaScript possde une bibliothque standard d'objets natifs. Veuillez lire la rfrence pour en savoir plus sur ces objets.

Dterminer le type des objets grce l'oprateur typeof

L'oprateur typeof peut vous aider dterminer le type d'une variable. Pour plus d'informations et sur les cas particuliers, voir la page de rfrence sur cet oprateur.

Voir aussi


Web Proxy Viewer  |  New URL  |  Original Page