2011-07-09 2 views
5

J'entends par là l'appel .push() sur un objet Array et JavaScript augmente la capacité (en nombre d'éléments) du "tableau" sous-jacent. De plus, s'il existe une bonne ressource pour trouver ce type d'information pour JS, il serait utile de l'inclure.Comment les navigateurs modernes implémentent-ils JS Array, en ajoutant spécifiquement des éléments?

modifier

Il semble que le tableau JS est comme un littéral d'objet avec des propriétés spéciales. Cependant, je m'intéresse à un niveau de détail inférieur - comment les navigateurs implémentent ceci dans leurs moteurs JS respectifs.

+0

que voulez-vous dire par capacité? taille en octets? – Ibu

+1

J'imagine que cela dépend de l'implémentation. Je ne pense pas qu'il est spécifié que cela doit être fait d'une certaine manière ... – jswolf19

+0

@ jswolf19 J'ai supposé que personne comme W3C ou Ecma n'a spécifié une implémentation, mais il y a sûrement des implémentations, par ex. pour webkit. – Jeff

Répondre

4

Il ne peut y avoir seule réponse correcte à cette question. Le mécanisme d'expansion d'un tableau est un détail d'implémentation interne et peut varier d'une implémentation JS à une autre. En fait, le moteur de Tamarin a deux implémentations différentes utilisées en interne pour les tableaux selon qu'il détermine si le tableau va être séquentiel ou épars.

+0

+1, je vous donnerais plus si je ne pouvais pas apprendre souvent quelque chose de nouveau sur JS :) Apparemment, Chrome et FF utilisent des implémentations similaires (à la fois un vecteur et un hachage, ou similaire) comme on peut le déduire des benchmarks: http://jsperf.com/array-popuplation-direction –

+0

@Samuel Neff C'est vraiment intéressant. Comment trouvez-vous comment les différents navigateurs (leurs moteurs JS respectifs) fonctionnent à ce niveau? – Jeff

+0

Un article intéressant sur ce sujet: http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics –

0

Javascript inclut un mécanisme pour déclarer la longueur de votre tableau comme:

var foo = new Array(3); 
alert(foo.length); // alerts 3 

Mais puisque les tableaux sont dynamiques en javascript il n'y a aucune raison de cela, vous ne devez pas affecter manuellement vos tableaux . L'exemple ci-dessus ne crée pas un tableau de longueur fixe, il suffit de l'initialiser avec 3 éléments non définis. // Éditer: J'ai mal lu votre question ou vous l'avez changée, désolé je ne pense pas que ce soit ce que vous demandiez.

+0

Informations utiles, mais il n'est pas correct de dire qu'il n'y a aucune raison de le faire. Il est très possible que l'initialisation d'un tableau à une longueur future connue rendra son ajout ultérieur plus efficace. Cela dépend entièrement de la mise en œuvre de chaque navigateur, mais peut être une grande amélioration des performances en fonction de l'implémentation. –

1

Cette réponse est fausse. S'il vous plaît voir la réponse de @Samuel Neff et les ressources suivantes:

http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics

http://jsperf.com/array-popuplation-direction

Les tableaux en JavaScript ne sont pas une capacité car ils ne sont pas des tableaux réels. Ils sont en fait juste objet hash avec une propriété length et les propriétés des "0", "1", "2", etc. Quand vous faites .push() sur un tableau, il réalise effectivement:

ary[ ary.length++ ] = the_new_element; // set via hash 

+1

Vous pouvez laisser le '++' sur 'ary.length'. – Reid

+0

@Reid - non, vous ne pouvez pas. Le ++ doit incrémenter array.length, ne pas utiliser lors de la définition de la valeur (je faisais référence à ce qui se passait dans le moteur, pas au code JS) –

+0

@cwolves, votre description d'un objet Array dans Javascript n'est pas fausse à tout, ce sont des objets simples comme vous le dites, avec des caractéristiques spéciales - comme leur propriété 'length' -, ils héritent de' Array.prototype' et leur propriété interne [[Class]] 'est' 'Array" ', par exemple '({}). toString.call ([]); // "[tableau d'objets]" ', mais oui, les internes de la gestion de la mémoire sont complètement dépendants de l'implémentation *. – CMS

Questions connexes