Check out Firefox Developer Edition, the first browser built for developers like you. http://mzl.la/112VrtT

mozilla
Vos résultats de recherche

    Structures de données

    Cet article nécessite une relecture technique.

    Tous les langages de programmation ont des structures de données prédéfinies, mais celles-ci diffèrent de l’un à l’autre. Cet article essaye de lister toutes les structures de données prédéfinies en JavaScript ainsi que les propriétés qu’ils ont; celles-ci peuvent être utilisées pour construire d’autres structures de données. Quand c’est possible, des comparaisons seront faites avec les autres langages de programmation

    Le standard ECMAScript défini six types de données :

    • Number
    • String
    • Boolean
    • Null
    • Undefined
    • Object

    Dans les sections suivantes, nous allons voir comment ces types peuvent être utilisés pour représenter des données et combinés pour implémenter des structures de données plus complexes.

    Valeurs primitives

    Tous les types sauf les objets ont des valeurs immutables. De façon spécifique, les chaînes de caractères sont immutables (c’est le contraire dans le langage C, par exemple). Nous nous référons aux valeurs de ces types comme des « valeurs primitives ». Ceci est expliqué plus en détail dans la section sur les Chaînes_de_caractères ci-dessous.

    Booleans, null et undefined

    Parmi ces types, quatre constantes sont disponibles : true, false, null, et undefined. Puisque ce sont des constantes, il est impossible de représenter des données riches (ainsi que des structures de données) avec celles-ci.

    Nombres

    D’après le standard ECMAScript, il y a seulement un seul type de nombre, qui est le "double-precision 64-bit binary format IEEE 754 value", en particulier il n’y a pas de type spécifique pour les entiers. En plus de pouvoir représenter les nombres à virgule flottante, il a plusieurs valeurs symboliques : +Infinity (Infini positif), -Infinity (Infini négatif), et NaN (n’est pas un nombre).

    Bien qu’un nombre ne représente souvent que sa valeur, JavaScript possède plusieurs opérateurs binaires. Ceux-ci peuvent être utilisés pour représenter plusieurs valeurs booléennes en utilisant le masquage de bits. Ceci est généralement considéré comme une mauvaise pratique, puisque JavaScript a d’autres moyens de représenter un ensemble de booléens (comme un tableau de booléens ou un objet avec des valeurs booléennes associées à des propriétés nommées) et que le masquage de bits rend souvent le code plus difficile à lire, comprendre et maintenir. Il peut être nécessaire d’utiliser ce genre de technique dans des environnements critiques, comme lorsque l’on tente de minimiser l’espace de stockage local ou dans des cas extrêmes où chaque bit transmit sur le réseau compte. Cette technique ne devrait être utilisée qu’en dernier recours pour optimiser la taille.

    Chaînes de caractères

    Contrairement aux langages comme C, les chaînes de caractères sont immutables en JavaScript. Ce qui veut dire qu’une fois qu’une chaîne est créée, il est impossible de la modifier. Cependant, il est possible de créer une autre chaîne basée sur une opération effectuée sur la chaîne originale, par exemple une sous-chaîne de l’originale (en prenant des lettres individuelles ou en utilisant String.substr()) ou une conaténation de deux chaînes en utilisant l’opérateur de concaténation (+) ou String.concat().

    Attention au « chaîne-typage » !

    Il peut être tentant d’utiliser des chaînes de caractères pour représenter des données complexes. Elles ont quelques propriétés intéressantes :

    • Il est facile de construire des chaînes complexes avec la concaténation.
    • Les chaînes de caractères sont faciles à débuger (Ce que l’on voit s’afficher est ce qu’il y a dans la chaîne).
    • Les chaînes de caractères sont les dénominateurs communs de beaucoup d’API (interfaces de programmation), comme les champs de formulaires, les valeurs du stockage local, ou encore les réponses de XMLHttpRequest quand on utilise responseText, et il peut être tentant de ne travailler qu’avec des chaînes de caractères.

    Avec des conventions, il est possible de représenter n’importe quelle structure de données dans une chaîne de caractères. Cela n’en fait pas une bonne idée. Par exemple, avec un séparateur, on peut émuler une liste (même si un tableau serait plus approprié). Malheureusement, quand ce séparateur est utilisé dans un des éléments de la « liste », celle-ci est cassée. Un caractère d’échappement peut être choisi, etc. Tout ceci demande des conventions et devient un cauchemard à maintenir qui n’existe pas quand on choisi le bon outil pour la bonne tâche.

    Il est recommandé d’utiliser les chaînes de caractères pour les données textuelles et symboliques, mais de convertir les chaînes et d’utiliser la bonne abstraction pour représenter ces données.

    Objets

    En JavaScript, les objets peuvent être vus comme des sacs de propriétés. Avec la syntaxe littérale des objets, un ensemble limité de propriétés sont initialisées; ensuite de nouvelles propriétés peuvent être ajoutées et d’autres supprimées. Les valeurs des propriétés peuvent être de n’importe quel type, y compris d’autres objets, ce qui permet de construire des structures de données complexes.

    Objets « normaux » et fonctions

    Un objet, en JavaScript, est une correspondance entre des clefs et des valeurs. Les clefs sont des chaînes de caractères et les valeurs peuvent être n’importe quoi. Ceci rend l’objet un bon choix pour les tables de hashage. Cependant, il faut faire attention à propos de la pseudo-propriété non-standard __proto__. Dans un environnement qui la supporte, '__proto__' ne permet pas de manipuler une propriété qui porte ce nom, mais le prototype de l’objet. Dans un contexte où on ne sait pas forcément d’où vient la chaîne de caractères (comme dans un champ de formulaire), il faut faire attention : d’autres ont eu des problèmes avec ça. Dans ce cas, une alternative est d’utiliser une abstraction StringMap.

    Les fonctions sont des objets réguliers avec la capacité additionnelle de pouvoir être appelées.

    Tableaux

    Les tableaux sont des objets réguliers pour lesquels il y a  une relation particulière entre les propriétés qui représentent des nombres entiers et la propriété 'length'. De plus, les tableaux héritent de Array.prototype qui permet d’utiliser un certain nombre de fonctions pratiques pour manipuler des tableaux, comme indexOf (chercher une valeur dans un tableau) ou push (ajouter un élément à la fin d’un tableau), etc. Cela fait des tableaux un choix parfait pour représenter des listes ou ensembles d’éléments.

    Dates

    Pour représenter des dates, le mieux est d’utiliser le type Date prédéfini.

    WeakMaps, Maps, Sets

    Non standards. Seront très probablement standardisés comme parties du standard ECMAScript 6.

    Ces structures de données utilisent des références d’objets comme clefs. Un Set représente un ensemble d’objets, tandis que les WeakMaps et Maps (tables de correspondance) associent une valeur à un objet. La différence entre les deux est que les objets formant les clefs peuvent être énumérés dans le premier cas. Cela permet d’optimiser le ramasse-miettes dans le dernier cas.

    On peut implémenter les Maps et Sets en pure ECMAScript 5. Cependant, puisque les objets ne peuvent être comparés (dans le sens de « moins que », par exemple), les performances pour accéder à une clef seront forcément linéaires. Les implémentations natives (dont les WeakMaps) peuvent avoir des performances approximativement linéaires en temps constant.

    De manière générale, pour associer des données avec un nœud DOM, on peut ajouter des propriétés directement sur l’objet, ou utiliser les attributes data-*. L’inconvénient est que ces données sont accessibles à n’importe quel script tournant dans le même contexte. Les Maps et WeakMaps permettent d’associer des données à un objet de façon privée.

    TypedArrays

    Non standard. Sera très probablement standardisé comme partie du standard ECMAScript 6.

    Voir aussi

    Étiquettes et contributeurs liés au document

    Étiquettes : 
    Contributeurs ayant participé à cette page : Fredchat, bfn, ferncoder, Havano, tym, teoli
    Dernière mise à jour par : Havano,