2012-01-31 22 views
12

Así que estoy usando esto en Internet Explorer 8:IE8 para ... en empadronador

var hi=["hi", "lo", "foo", "bar"]; 
for(i in hi){console.log(i)}; 
//WTF is that indexOf i value? 
LOG: 0 
LOG: 1 
LOG: 2 
LOG: 3 
LOG: indexOf 
undefined 

en cromo y otros, sólo voy a conseguir 0-3, ninguna cosa misteriosa "indexOf". ¿Por qué y cuál es la solución?

Respuesta

23

No utilice for...in para arreglos. Lo mejor es usar el lazo tradicional for en ese caso.

La razón es porque for...in mira la matriz como un objeto, y por lo tanto las propiedades como indexOf o length se pueden incluir en el bucle. El bucle normal for solo trata con teclas numéricas, por lo que se evita este problema.

En una nota al margen, las propiedades no deseadas pueden aparecer al iterar también sobre objetos planos (como otros han notado, las propiedades que agregue al prototipo del objeto aparecerán). Se puede evitar esto mediante la escritura de sus for...in bucles de esta manera:

var obj = { ... }; 
for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    var item = obj[prop]; 
    ... 
    } 
} 

Para ser claro, sin embargo: que todavía no debe utilizar este método en las matrices.

+0

gracias! Ninjas ... – randomor

7

Usted está utilizando el tipo incorrecto de bucle para una matriz - for ... in ... también incluirá cualquier enumerables propiedades del objeto, que en su caso incluye el método .indexOf().

Use este lugar:

var i, n = hi.length; 
for (i = 0; i < n; ++i) { 
    console.log(i, hi[i]); 
} 

Chrome y otros navegadores hasta la fecha implementan ECMAScript 5, y correcta marcan todos los métodos incorporados como no enumerables propiedades.

+1

¡Ja, batallamos de nuevo! – benekastah

+0

'indexOf' no es un método de matriz en IE8, se agrega desde el usuario por lo que aparece – Esailija

+0

IE8 no tiene' indexOf() '? Guau... – Alnitak

4

Esto sucede porque un script que está incluyendo en su página está agregando el método indexOf al Array.prototype. Esto significa que todas las matrices heredan un método indexOf, lo cual es bueno, ya que significa que puede usar ese método incluso en IE8.

Pero, como no hay manera de marcar una propiedad como no enumerable en IE8, terminará viéndola cada vez que enumere todas las propiedades de la matriz, que es lo que hace en un for - in lazo. Probablemente haya deseado un bucle for.