2008-10-03 8 views

Respuesta

2

Si myArray es javascript array, entonces no importa lo suficiente como para que se preocupe, solo se trata de una propiedad de búsqueda de un objeto, pero también lo es el uso variable.

Si la longitud OTH es una propiedad expuesta por un objeto de colección proporcionado por un navegador de DOM (especialmente IE), entonces puede ser sorprendentemente caro. Por lo tanto, al enumerar una colección proporcionada por DOM, tiendo a usar: -

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

pero para las matrices no me molesto con eso.

+0

acceder a una variable local no es un acceso a la propiedad; es una búsqueda directa mucho más rápida, con diversos grados de franqueza según la implementación. Ninguna implementación importante (excluyendo IE por supuesto * suspiro *) hace una búsqueda de propiedad real más. – olliej

1

No. No recalcula en llamada. Se vuelve a calcular según sea necesario dentro de la clase Array.

Se va a cambiar cuando se utiliza empuje, pop, cambio, unshift, concat, empalme, etc. De lo contrario, es sólo un número - el mismo ejemplo, cada vez usted llama por su valor.

Pero, siempre que no lo anule explícitamente (array.length = 0), será preciso con cada llamada.

0

Mientras que la segunda forma puede ser más rápido:

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 

..se no debería realmente importa en todo caso, no borde.

1

La propiedad de longitud no se calcula en cada llamada, pero esta última versión será más rápida ya que está guardando en caché la búsqueda de propiedades. Incluso con las implementaciones más actualizadas de JS (V8, TraceMonkey, SquirrelFish Extreme) que usan caché de propiedades avanzadas (por ejemplo, SmallTalk era;)), la búsqueda de propiedades sigue siendo al menos una rama condicional adicional más que su segunda versión.

Array.length no es constante, sin embargo, como las matrices JS son mutables, por lo que push, pop, array[array.length]=0, etc pueden cambiarlo.

Hay otros conceptos como el DOM NodeList que obtienes de llamadas como document.getElementsBySelector que se espera que sean reales, en cuyo caso la longitud se puede recalcular al iterar. Pero luego, si la longitud se vuelve a calcular, existe una buena posibilidad de que también haya cambiado realmente, por lo que el almacenamiento en caché manual de la salida puede no ser válido.

0

De acuerdo con la ECMAScript specification, que sólo le dice cómo la propiedad "longitud" se debe calcular, pero no dice cuando . Creo que podría depender de la implementación.

Si tuviera que implementarlo, lo haría como Jonathan señalado, pero que en el caso de la propiedad "longitud" de los objetos de la matriz.

0

Si alguna vez tiene una idea que podría cambiar durante el bucle entonces por supuesto que se debe comprobar para cada bucle ...

- cosa que es, obviamente, los frutos secos para pedir un objeto varias veces, como lo haría ser si se coloca en la evaluación de la propiedad de la sentencia if ...

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

- sólo en casos especiales que usted debe pensar en hacer otra cosa! -)

2

creo que la respuesta a la La intención de su pregunta es, sí, la propiedad array.length se vuelve a calcular cada a través del bucle si modifica la matriz en el bucle. Por ejemplo, el siguiente código:

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(); 
} 

salida voluntad:

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

mientras que este código:

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(); 
} 

salida voluntad:

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

-J

Cuestiones relacionadas