7
votes

Objet semblable à une matrice en JavaScript

regarder via la source DOM.JS à partir de la bibliothèque de fermeture J'ai trouvé ceci (dans goog.dom.getelementsbytagnameldclass _ ): xxx

Quel serait l'avantage de faire cela sur un tableau régulier?


0 commentaires

6 Réponses :


-3
votes

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.


3 commentaires

Pas exactement. Les objets d'objets / associatifs n'ont pas de propriété , c'est pourquoi la bibliothèque de fermeture l'ajoute dans ce cas (par exemple: console.log ({}. Longueur, [] ) => "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 ne reste pas une trace des objets à clé non entière. C'est PHP qu'ils sont exactement les mêmes



2
votes

Dans ce cas, mon hypothèse serait que 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.

résultats (de OS X 10.5.8, FF 3.5.6) *: P>

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");


3 commentaires

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.



3
votes

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.

Il pourrait y avoir deux raisons pour lesquelles je pouvais penser:

  1. Utilisation de la mémoire - Si la matrice est soutenue par la mise en oeuvre qui alloue n éléments, lorsqu'elle atteint ses limites, il augmente par un facteur d'augmentation de sa capacité, et donc des déchets la capacité de la capacité de la mémoire
  2. 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.

    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.

    édité après commentaire de Justin

    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.

    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.

    Une troisième option pourrait être la clé: Conformité aux normes d'API JavaScript.


2 commentaires

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 ...



0
votes

Je ne vois aucune différence depuis alerte (typeof []); 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.

Il rétorre essentiellement un tableau sans toutes les fonctions héritées telles que Push et pop .


2 commentaires

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é.



0
votes
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. 

0 commentaires

2
votes

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).

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 à 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.


0 commentaires