regarder via la source DOM.JS à partir de la bibliothèque de fermeture J'ai trouvé ceci (dans Quel serait l'avantage de faire cela sur un tableau régulier? p> p> goog.dom.getelementsbytagnameldclass _ code>):
6 Réponses :
Autant que je sache, il n'y a pas d'avantage car il n'y a aucune différence que ce soit entre cela et un "tableau régulier", à l'exception de la syntaxe de création - Tous les objets JavaScript sont des tableaux associatifs. P>
Pas exactement. Les objets d'objets / associatifs n'ont pas de propriété code> code>, c'est pourquoi la bibliothèque de fermeture l'ajoute dans ce cas (par exemple: console.log ({}. Longueur, [] ) code> => "indéfini 0").
En outre, les tableaux ([]) ont un ensemble de méthodes plus larges (voir tableau.Prototype).
Les tableaux étendent des objets (tableaux associatifs); Il ajoute toutes les méthodes de tableau, plus conserve une trace de la longueur. Notez que code> code> ne reste pas une trace des objets à clé non entière. C'est PHP qu'ils sont exactement les mêmes
Dans ce cas, mon hypothèse serait que résultats (de OS X 10.5.8, FF 3.5.6) *: P> ortlifiant [len ++] = el code> est une optimisation sur
actualisateur.push (el) code>. Cependant, après avoir effectué une référence simple (code fourni ci-dessous des résultats), il apparaît que cette méthode est effectivement plus lente que d'utiliser une matrice standard à l'aide de la méthode code> code> ainsi que de la même technique de construction.
var MAX = 100000, i = 0,
a1 = {}, a2 = [], a3 = [],
value = "";
for ( i=0; i<1024; ++i ) {
value += "a";
}
console.time("associative construction");
for ( i=0; i<MAX; ++i ) {
a1[i] = value;
}
a1.length = i;
console.timeEnd("associative construction");
console.time("push construction");
for ( i=0; i<MAX; ++i ) {
a2.push(value);
}
console.timeEnd("push construction");
console.time("indexed construction");
for ( i=0; i<MAX; ++i ) {
a3[i] = value;
}
console.timeEnd("indexed construction");
Chaque fois que cela fait une référence, n'oubliez pas de crisser sur IE 6. Beaucoup de hacks de performances étranges que vous voyez peuvent être là pour travailler autour de certaines caractéristiques de performance horribles d'IE 6, tout en fournissant peu de prestations sur d'autres navigateurs.
En effet, je suis conscient de cela. Mais comme je l'ai dit, je suis sur un Mac pour le moment et incapable de tester une gamme complète de navigateurs.
Exactement, Brian. Et il serait logique de favoriser c.-à-d. Sur la performance en raison de la part de marché du navigateur (il y a beaucoup d'ennemis là-bas, mais les faits sont des faits). De plus, assurez-vous d'exécuter ce test avec le moteur V8 de Google.
L'auteur du code a utilisé l'objet JavaScript vide comme base d'un objet similaire, c'est-à-dire celui qui peut être consulté par index et a une propriété de longueur. P>
Il pourrait y avoir deux raisons pour lesquelles je pouvais penser: p>
la capacité de la capacité li> de la mémoire li >
- Temps de processeur - Mise en œuvre Choisissez une vitesse d'insertion sur la vitesse d'accès aléatoire - un retour de cette méthode est plus susceptible d'être itéralé sur de manière séquentielle que dans un accès aléatoire et redimensionnement de la matrice dans l'insertion entraîne une allocation-Copier-transcopie qui a une pénalité de la CPU. li>
ol>
Je parie que ce code similaire serait trouvé dans d'autres bibliothèques JavaScript et que cela résulte de l'analyse comparative et de la recherche de la meilleure solution à l'autre sur différents navigateurs. P>
édité après commentaire de Justin em> p>
Sur la poursuite de Googling, il semble que des objets de type tableau sont courants parmi les développeurs JavaScript: Checkout JavaScript: Le guide définitif de David Flanagan, il dispose d'un tout Sous-Chapitre sur des objets de type tableau . Aussi Ces < Un href = "http://shifteleven.com/articles/2007/06/28/array-like-Objects-in-javascript" rel = "Nofollow Noreferrer"> Les gars les mentionnent. P>
Aucune mention de la raison pour laquelle il faut que l'on préfère un objet de tableau VS en forme de tableau. Cela pourrait être un bon alors question. P>
Une troisième option pourrait être la clé: Conformité aux normes d'API JavaScript. P>
La capacité ne pousse pas nécessairement avec chaque insertion. Il s'agit d'une optimisation courante de croître la capacité d'une valeur supérieure à 1 chaque fois que la capacité d'un conteneur est atteinte. Je n'ai pas regardé le code du moteur, mais je serais prêt à mettre de l'argent sur cette optimisation étant présente. En ce qui concerne le temps de la CPU, mon indice de référence montre le contraire, a accordé que ce n'est qu'à 3.5,6 FF 3.5.6.
Vous êtes bien sûr, c'est vrai, mais je ne l'ai pas fait (signifie) impliquer que la capacité augmenterait avec chaque insertion ...
Je ne vois aucune différence depuis Il rétorre essentiellement un tableau sans toutes les fonctions héritées telles que alerte (typeof []); code> retourne "objet". Chaque fois que je vois quelque chose comme ça (surtout du goog), je dois supposer que c'est pour un coup de pouce de performance. P>
Push code> et
pop code>. P>
Je pensais la même chose aussi. S'avère que nous étions tous les deux mal. Voir ma référence
En fait, la dernière fois que j'ai vérifié, la fermeture de Google n'a pas été optimisée pour la performance du tout et ressemblait davantage à un code hérité.
goog.dom.getElementsByTagNameAndClass_ You are dealing with html collections. An arrayLike object is a snapshot of a node list, rather than the 'live' collection object. It makes it as easy as an indexed array to work with, and less likely to cause complications if you create or delete nodes while looping through its members.
Je pense que cet exemple crée un objet de type tableau au lieu d'un réseau réel, car d'autres méthodes DOM renvoient également des objets de type réseau (NODELIST). P>
Utiliser systématiquement à l'aide de "gares-goûts" dans l'API oblige le développeur à éviter d'utiliser les méthodes spécifiques à une matrice (en utilisant goog.array code> à la place), il y a donc moins de gotchas quand quelqu'un décide plus tard de changer Un appel de getelementsBytaGnieNdClass a appelé, disons, getElementyTagname. p>