2011-08-19 9 views
6

Parece que no entiendo el significado de la palabra clave in en JavaScript.iterando Javascript matrices con el "en" palabra clave

Tenga una mirada en este fragmento de código (http://jsfiddle.net/3LPZq/):

var x = [1,2] 
for(i in x){ 
    document.write(x[i]); 
} 

cuando se ejecuta en el jsFiddle, imprime no sólo los valores contenidos en la matriz, sino también todas las propiedades y métodos del objeto matriz.

Cuando cambio como este (http://jsfiddle.net/4abmt/):

$(document).ready(function(){ 
var x = [1,2] 
for(i in x){ 
    document.write(x[i]); 
}}); 

imprime sólo los valores 1 y 2.

¿Por qué sucede esto? ¿Esto es causado por jQuery o el comportamiento de la palabra clave in depende de si el documento está completamente cargado o no?

+1

En el primer ejemplo se han seleccionado como Mootools biblioteca (que parece extenderse el prototipo). Si no selecciona ninguna biblioteca, el resultado es: http://jsfiddle.net/fkling/3LPZq/6/. Pero tenga en cuenta que es una mala práctica usar 'for ... in' para iterar sobre las matrices. –

Respuesta

2

Algunas de las bibliotecas cargadas por jsFiddle extienden el prototipo por defecto de la matriz, por lo que muestra estas funciones adicionales. jQuery no extiende el prototipo de matriz y por lo tanto no ve funciones adicionales.

+0

Gracias! Eso responde mi pregunta. –

3

Esto sucede debido a la herencia de prototipo. Un objeto no solo muestra sus propias propiedades, sino también todas sus propiedades ancestrales.

para encontrar sólo propias propiedades de un objeto, utilice obj.hasOwnProperty(prop).

var x = [1,2]; 
for (var i in x) { 
    if (x.hasOwnProperty(i)) { 
     document.write(x[i]); 
    } 
} 

Consulte MDN Docs en hasOwnProperty.

+0

lo entiendo, pero entonces ¿por qué en el segundo ejemplo sólo muestra 1 y 2 y ninguna de las otras propiedades de la matriz? –

+0

+1, definitivamente la forma de iterar correctamente sobre un objeto. – Exelian