69 votes

Pourquoi l'index d'une chaîne de caractères dans un tableau n'augmente-t-il pas la "longueur" ?

Dans l'exemple ci-dessous, le array2.length est seulement 10 alors que dans mon esprit, ce devrait être 13 .

Pourquoi les index "string keyed" n'augmentent-ils pas le nombre d'heures de travail ? length du tableau ?

Je peux stocker des choses et y accéder, et le débogueur VS montre que ces tableaux sont stockés correctement. Alors pourquoi le length n'a pas augmenté ?

var array2 = new Array();
array2["a"] = new Array();
array2["b"] = new Array();
array2["c"] = new Array();
for (var i = 0; i < 10; ++i)
    array2[i] = new Array();

var nothing = "";
for (var i = 0; i < array2.length; ++i)
    nothing = "";

0 votes

0 votes

En description de Array sur MDN (Mozilla Developer Network) vous dit tout ce que vous devez savoir.

143voto

deceze Points 200115

Les tableaux en Javascript ne peuvent pas avoir d'"index de chaîne". Un tableau Javascript Array est exclusivement indexé numériquement. Lorsque vous définissez un "indice de chaîne", vous définissez une propriété de l'objet. Les deux sont équivalents :

array.a = 'foo';
array['a'] = 'foo';

Ces propriétés ne font pas partie du "stockage de données" du tableau.

Si vous voulez des "tableaux associatifs", vous devez utiliser un objet :

var obj = {};
obj['a'] = 'foo';

Peut-être que la visualisation la plus simple est d'utiliser la notation littérale au lieu de new Array :

// numerically indexed Array
var array = ['foo', 'bar', 'baz'];

// associative Object
var dict = { foo : 42, bar : 'baz' };

11 votes

Pour être juste, les indices numériques sont aussi des propriétés de l'objet. Les tableaux fonctionnent très bien si vous utilisez la représentation en chaîne de l'indice au lieu d'utiliser un nombre : var xs = [10, 20, 30]; console.log(xs['1']);

7 votes

Eh bien oui, cela renvoie au fait que pratiquement tout en Javascript est un objet, une fonction, un objet et la fonction . et la notation [] d'accéder aux propriétés des objets sont toutes les mêmes en réalité. Pourtant, définir des "indices de chaîne" sur un objet Array n'utilise pas les caractéristiques de tableau de l'objet Array objet.

2 votes

Bien qu'il semble que le tableau et l'objet soient identiques, la différence réside dans les méthodes de prototypage que nous obtenons avec le tableau et non avec l'objet. Nous ne pouvons pas simplement utiliser des méthodes comme 'push', 'unshift' etc. avec des objets.

22voto

hugomg Points 29789

Parce que la longueur est défini comme suit un plus le plus grand indice numérique du tableau.

var xs = [];
xs[10] = 17;
console.log( xs.length ); //11

C'est pourquoi vous ne devez utiliser les tableaux que pour stocker des éléments indexés par des nombres, et utiliser des objets simples si vous souhaitez utiliser des chaînes de caractères comme clés. Par ailleurs, il est préférable d'utiliser des littéraux tels que [] o {} au lieu de new Array y new Object .

12voto

sje397 Points 23619

Vous n'ajoutez pas d'éléments au tableau ; vous ajoutez des propriétés au tableau. Array objet.

4voto

Comme indiqué ci-dessus, utilisez l'objet pour les tableaux associatifs.

Si vous ne le faites pas, vous ne remarquerez pas nécessairement que vous vous y prenez mal, jusqu'à ce que vous utilisiez innocemment "longueur" comme indice de tableau :

var myArray = [];
myArray["foo"] = "bar"; //works
console.log(myArray["foo"]) //print "bar"
myArray["length"] = "baz" //crash with a "RangeError: Invalid array length"

C'est parce que vous remplacez le length d'un tableau avec une chaîne, ce qui n'est pas valide.

3voto

bhamlin Points 5029

Les index "string keyed" ne sont pas du tout des index, mais des propriétés. array2["a"] c'est la même chose que de dire array2.a . Rappelez-vous que vous pouvez définir des propriétés sur n'importe quel type de variable en javascript, ce qui est exactement ce que vous faites ici.

0 votes

Vous ne pouvez pas définir de propriétés sur null , undefined :P. De plus, certains objets maléfiques du navigateur IE ne vous permettent pas de définir ou d'obtenir des propriétés personnalisées sur eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X