web-dev-qa-db-fra.com

Pourquoi puis-je ajouter des propriétés nommées à un tableau comme s'il s'agissait d'un objet?

Les deux extraits de code différents suivants me semblent équivalents:

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

et

var myObject = {'A': 'Athens', 'B':'Berlin'};

parce qu'ils se comportent tous les deux de la même manière, ainsi que typeof(myArray) == typeof(myObjects) (les deux donnent 'objet').

Y a-t-il une différence entre ces variantes?

101
prinzdezibel

Pratiquement tout en javascript est un objet, vous pouvez donc "abuser" d'un objet Array en y définissant des propriétés arbitraires. Ceci devrait être considéré nocif quoique. Les tableaux sont destinés aux données indexées numériquement. Pour les clés non numériques, utilisez un objet.

Voici un exemple plus concret pour lequel les clés non numériques ne "correspondent" pas à un tableau:

var myArray = Array();
myArray['A'] = "Athens";
myArray['B'] = "Berlin";

alert(myArray.length);

Cela n'affichera pas '2', mais '0' - effectivement, aucun élément n'a été ajouté au tableau, juste quelques nouvelles propriétés ajoutées à l'objet tableau.

125
Paul Dixon

Dans JS, les tableaux sont des objets, juste légèrement modifiés (avec quelques fonctions supplémentaires).

Fonctions comme:

concat
every   
filer
forEach
join
indexOf
lastIndexOf
map
pop
Push
reverse
shift
slice
some
sort
splice
toSource
toString
unshift
valueOf 
14
Casey

Tout en JavaScript est un objet à part les types primitifs.

Le code

var myArray = Array();

crée une instance de l'objet Array en 

var myObject = {'A': 'Athens', 'B':'Berlin'};

crée une instance d'objet Object.

Essayez le code suivant

alert(myArray.constructor)
alert(myObject.constructor)

Donc, vous verrez que la différence réside dans le type de constructeur d'objet.

L'instance de l'objet Array contiendra toutes les propriétés et méthodes du prototype Array.

5
Dasha Salo

Une différence pratique réside dans l'utilisation de JSON.stringify sur une array tout non numérique index sont ignorés:

var arr = [];
var obj = {};

arr['name'] = 'John';
obj['name'] = 'John';

console.log(arr);    // will output [name: "John"]
console.log(obj);    // will output {name: "John"}

JSON.stringify(arr); // will return []
JSON.stringify(obj); // will return {"name":"John"}
1
user5513314

La différence entre les tableaux et les autres objets en JavaScript. Alors que les tableaux ont une propriété de longueur mise à jour de façon magique, pour les objets autres que les tableaux, il n’ya aucun moyen de mettre en œuvre une telle propriété.

var arrName = [];
arrName[5] = "test";
arrName.length; // <- 6

Les tableaux sont utilisés pour stocker des objets avec un index ordinal - utilisez-les comme un tableau, une pile ou une file d'attente traditionnels. Un objet est un hachage - utilisez-le pour les données ayant une clé distincte.

0
Parth Raval