objetos matriz especifico eliminar elementos elemento array agregar javascript arrays loops

matriz - ¿Por qué ''para(var item in list)'' con arrays se considera una mala práctica en JavaScript?



matriz javascript (4)

¿Velocidad?

for(..;..;..) bucle demostró ser 36 veces más rápido que for .. in cuando lo probé aquí.

Enlace cortesía de esta respuesta SO

Dado un conjunto simple basado en cero, indexado numéricamente:

var list = [''Foo'', ''Bar'', ''Baz''];

Muchas veces, me he dado cuenta de que cuando alguien sugiere recorrer variables en una matriz como esta:

for(var item in list) { ... }

... es casi seguro que alguien sugiera que esa es una mala práctica y sugiere un enfoque alternativo:

var count = list.length; for(var i = 0; i < count; i++) { var item = list[i]; ... }

¿Cuál es el razonamiento para no usar la versión más simple anterior y para usar el segundo ejemplo en su lugar?


Agregar list.foo = bar; y trata de usar simple for . Si no utiliza algunas bibliotecas (como prototypeJs) y no agrega ninguna propiedad nueva al objeto de matriz, puede usar una instrucción for simple.


En primer lugar, el orden del ciclo no está definido para un bucle for...in , por lo que no hay garantía de que las propiedades se iteren en el orden que desee.

En segundo lugar, for...in itera sobre todas las propiedades enumerables de un objeto, incluidas las heredadas de su prototipo. En el caso de las matrices, esto podría afectarle si su código o cualquier biblioteca incluida en su página ha aumentado el prototipo de Array , lo que puede ser realmente útil:

Array.prototype.remove = function(val) { // Irrelevant implementation details }; var a = ["a", "b", "c"]; for (var i in a) { console.log(i); } // Logs 0, 1, 2, "remove" (though not necessarily in that order)


Si utiliza para / in de esa manera, el item enumera a través de los valores de cadena "0", "1", ..., por lo que no son los objetos reales en la lista. Entonces, el ''elemento'' en el primer fragmento se parece más al i en el segundo fragmento, no al item . Además, los valores de cadena se enumeran donde esperaría los números. Y te metes en problemas cuando tienes propiedades en la lista, como array.ID = "a123" , ya que también se enumerarán.

Pero con estas desventajas, sigo pensando que la sintaxis es muy útil, si su equipo es consciente de lo que hace.