2008-10-03 3 views

Répondre

2

Si myArray est un tableau javascript, cela n'a pas assez d'importance pour vous inquiéter, c'est juste une propriété de recherche sur un objet, mais aussi une utilisation variable.

Si la longueur OTH est une propriété exposée par un objet de collection fourni par un navigateur DOM (en particulier IE), elle peut être étonnamment coûteuse. Par conséquent, lorsque l'énumération d'une telle collection a fourni DOM j'ai tendance à utiliser: -

for (var i = 0, length = col.length; i < length; i++) 

mais pour les tableaux que je ne vous embêtez pas avec cela.

+0

l'accès à une variable locale n'est pas un accès de propriété - c'est une recherche directe beaucoup plus rapide, avec des degrés variables de direct selon l'implémentation. Aucune implémentation majeure (à l'exclusion de IE bien sûr * sigh *) ne fait plus de recherche de propriété. – olliej

1

Non. Il ne recalcule pas sur appel. Il recalcule selon les besoins dans la classe Array.

Il va changer lorsque vous utilisez pousser, pop, changement, unshift, concat, épissure, etc. Dans le cas contraire, il est juste un numéro - la même instance à chaque fois vous appelez pour sa valeur. Mais, tant que vous ne le remplacez pas explicitement (array.length = 0), il sera précis à chaque appel.

0

Alors que la deuxième forme peut être plus rapide:

function p(f) { var d1=new Date(); for(var i=0;i<20;i++) f(); print(new Date()-d1) } 
p(function(){for(var i=0;i<1000000; i++) ;}) 
p(function(){var a = new Array(1000000); for(var i=0;i<a.length; i++) ;}) 
> 823 
> 1283 

..il ne devrait pas vraiment d'importance, en tout cas non-bord.

1

La propriété length n'est pas calculée à chaque appel, mais la dernière version sera plus rapide lorsque vous mettrez en cache la recherche de propriété. Même avec les implémentations JS les plus récentes (V8, TraceMonkey, SquirrelFish Extreme) qui utilisent une mise en cache de propriétés avancée (par exemple SmallTalk era;)), la recherche de propriétés est toujours au moins une branche conditionnelle supplémentaire de plus que votre seconde version.

Array.length n'est cependant pas constant car les tableaux JS sont mutables, donc push, pop, array[array.length]=0, etc peut tous le changer.

Il existe d'autres concepts comme les DOM NodeList que vous obtenez à partir d'appels comme document.getElementsBySelector qui devraient être actifs, auquel cas la longueur peut être recalculée pendant que vous itérez. Mais si la longueur est recalculée, il y a de fortes chances qu'elle ait également changé, donc la mise en cache manuelle de la sortie peut ne pas être valide.

0

Selon le ECMAScript specification, il dit juste comment la propriété « longueur » doit être calculée, mais il ne dit pas quand . Je pense que cela dépend de l'implémentation.

Si je devais l'implémenter, je ferais comme Jonathan souligné, mais que dans le cas de la propriété "longueur" des objets de tableau.

0

Si vous avez déjà présenté une idée qu'il pourrait changer au cours de la boucle puis bien sûr il faut vérifier pour chaque boucle ...

- sinon il est évidemment noix de demander plusieurs fois un objet, comme il le ferait être si vous le placez dans l'évaluation-propriété de l'instruction if ...

if(i=0, iMax=object.length; iMax>i; i++) 

- que dans des cas particuliers, vous devriez penser à faire autrement -)

2

Je pense que la réponse à la l'intention de votre question est, oui, la propriété array.length est recalculée chaque eration à travers la boucle si vous modifiez le tableau dans la boucle. Par exemple, le code suivant:

var arr = [1,2,3]; 
for(var i = 0; i < arr.length; i++){ 
    console.debug("i = " + i); 
    console.debug("indexed value = " + arr[i]) 
    arr.pop(); 
} 

va afficher:

i = 0 
indexed value = 1 
i = 1 
indexed value = 2 

alors que ce code:

var arr = [1,2,3]; 
var l = arr.length; 
for(var i = 0; i < l; i++){ 
    console.debug("i = " + i); 
    console.debug("indexed value = " + arr[i]) 
    arr.pop(); 
} 

va afficher:

i = 0 
indexed value = 1 
i = 1 
indexed value = 2 
i = 2 
indexed value = undefined 

-J

Questions connexes