Foros del Web » Programando para Internet » Javascript »

No entiendo como funciona este bucle en javascript. ¿alguien puede explicarlo ?

Estas en el tema de No entiendo como funciona este bucle en javascript. ¿alguien puede explicarlo ? en el foro de Javascript en Foros del Web. Estoy siguiendo un tutorial de animación de objetos en javascript, pero me quedé atascado en la comprensión de un bucle que está implementado en dicho ...
  #1 (permalink)  
Antiguo 23/05/2012, 11:49
 
Fecha de Ingreso: septiembre-2011
Ubicación: Málaga
Mensajes: 10
Antigüedad: 12 años, 7 meses
Puntos: 0
No entiendo como funciona este bucle en javascript. ¿alguien puede explicarlo ?

Estoy siguiendo un tutorial de animación de objetos en javascript, pero me quedé atascado en la comprensión de un bucle que está implementado en dicho código. El bucle en cuestión es este:

for (var i=0;efectos[i];i++){
// acciones
}

siendo efectos un array de objetos como el que sigue:

[
{'inicio':0,'fin':350,'u':'px','propCSS':'width'},
{'inicio':0,'fin':350,'u':'px','propCSS':'height'} ,
{'inicio':0,'fin':1,'u':'','propCSS':'opacity'}
]


¿Alguien puede explicarme que significa, dentro de la cabecera del bucle for, efectos[i] ? No debe ser esta la condición de parada ? En cuyo caso, ¿cómo puede ser la condición de parada dependiente de una variable i que se va modificando en el transcurso del bucle for? ¿No implicaría esto que el bucle nunca pararía ?

Para quien le interese, el tutorial de animación que estoy siguiendo, y que parece bastante bueno, es el siguiente:

http://www.disegnocentell.com.ar/notas2.php?id=239

Gracias de antemano, espero vuestras opiniones y respuestas.
  #2 (permalink)  
Antiguo 23/05/2012, 13:40
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

La segunda expresión dentro del paréntesis del for siempre se convierte a Boolean. De manera tal que lo que ocurre es esto:
Código PHP:
<script type="text/javascript">
var 
o=[ 
{
'inicio':0,'fin':350,'u':'px','propCSS':'width'}, 
{
'inicio':0,'fin':350,'u':'px','propCSS':'height'} , 
{
'inicio':0,'fin':1,'u':'','propCSS':'opacity'
];
alert(Boolean(o[0]));//true
alert(Boolean(o[3]));//false
</script> 
  #3 (permalink)  
Antiguo 23/05/2012, 13:51
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

Esa forma de recorrer un array es más eficiente que usar la típica variable N=array.length. Pero solo puede usarse si se cumplen dos condiciones:
1-arrays que no sean asociativos (es decir, con índice numérico, y sin posiciones intermedias vacías.
2-Que el valor que contenga el array no sea un "falsy value", es decir, que no sea un valor que al conbertilo en boolean sea falso. Por ejemplo, el valor cero, es falso. O la cadena vacía "".

En ese caso, como el array contiene "objetos", se puede usar perfectamente. Cuando el índice apunte a una posición que no exista, devolverá un "undefined", que javascript interpreta como "false" si se usa como condición.
  #4 (permalink)  
Antiguo 23/05/2012, 14:25
 
Fecha de Ingreso: septiembre-2011
Ubicación: Málaga
Mensajes: 10
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

Gracias por todo compañeros!!
  #5 (permalink)  
Antiguo 23/05/2012, 14:26
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años
Puntos: 343
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

@marlanga

En JavaScript no existen los arrays asociativos (al menos no de manera nativa). Luego, que tenga posiciones intermedias vacías no afecta:

Código Javascript:
Ver original
  1. var arr = Array(5);
  2.  
  3. arr.push(1);
  4.  
  5. arr; // [undefined, undefined, undefined, undefined, undefined, 1]
  6.  
  7. for(var i = 0, l = arr.length; i < l; i++) {
  8.     console.log(i, arr[i]);
  9. }
  10.  
  11. /*
  12. 0 undefined
  13. 1 undefined
  14. 2 undefined
  15. 3 undefined
  16. 4 undefined
  17. 5 1
  18. */

Muy sutilmente, combertilo => convertilo :)
__________________
blog | @aijoona
  #6 (permalink)  
Antiguo 23/05/2012, 14:45
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

Las posiciones vacías me refería al array con índice de entero.
http://jsfiddle.net/nRTdx/

En cuanto al array asociativo... bueno, en javascript, si nos ponemos finos, TODO son objetos (incluso el function).

Última edición por marlanga; 23/05/2012 a las 14:54
  #7 (permalink)  
Antiguo 23/05/2012, 15:05
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años
Puntos: 343
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

Ah, no habia entendido la forma que planteabas de iterar. En dicho caso los falsy values si son molestos.

Con respecto a lo del array asociativo, un Array es un Object, pero no al revés. Y hago enfasis en esto, ya que es bastante común tratar a los Objects como arrays.
__________________
blog | @aijoona
  #8 (permalink)  
Antiguo 23/05/2012, 16:05
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

Cita:
- @aijoona: En JavaScript no existen los arrays asociativos ...
- @marlanga: ... bueno, en javascript, si nos ponemos finos, TODO son objetos ...
- @aijoona: ...un Array es un Object, pero no al revés...
Los muchos, que como yo, intentamos aprender javascript a fuerza de tutorial y precisamente con la guía de librosweb.es nos habremos encontrado con que definen a los objetos como arrays asociativos, cita textual:
"Técnicamente, un objeto de JavaScript es un array asociativo formado por las propiedades y los métodos del objeto. Así, la forma más directa para definir las propiedades y métodos de un objeto es mediante la notación de puntos de los arrays asociativos."

Mi pregunta es:
Si con paises['str'] añadimos propiedades a un objeto y no elementos a un array ¿entonces porque length devuelve 0 o undefined según se trate de un array o de un objeto y en todo caso no devueve undefined para ambos?

Código Javascript:
Ver original
  1. var paises = new Array();
  2. paises['ur'] = 'Uruguay';
  3. paises['ch'] = 'Chile';
  4. paises['co'] = 'Colombia';
  5. // parecería que añadimos valores al array
  6.  
  7. var provincias = new Object();
  8. provincias["sf"] = "santa fe";
  9. provincias["bs"] = "buenos aires";
  10. provincias["ch"] = "chaco";
  11. //añadimos propiedades al objeto
  12.  
  13. window.onload = function(){
  14.     console.log(paises.co);     //pero en realidad añadimos propiedades al objeto.
  15.     console.log(paises.length); // 0
  16.     console.log(provincias.length); // undefined
  17.     console.log(paises['co']);  //colombia
  18. }

Desde ya agradecido, cualquier link es bienvenido
  #9 (permalink)  
Antiguo 23/05/2012, 23:51
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

¡buenas!

@cena, honestamente no se que explicación más allá de la provista estás tratando de buscar. intentaré compartir mis ideas según como siempre he entendido el concepto. lo primero, hay que quitarse de la cabeza que los arrays asociativos existen en javascript. si fuera el caso, entonces debería ser posible tratar un array asociativo de la misma forma que un array indexado. uno de los ejemplos ya lo haz mostrado, la propiedad length se mantiene en cero en un objeto array o devuelve undefined en un objeto genérico. otro ejemplo que demuestra los arrays asociativos no existen es la carencia ‒ o la inhabilidad ‒ de los métodos para operar con array asociativos: push, shift, slice, splice, etc.

entonces, ¿por qué los tutoriales hacen mención de algo que no existe? en mi opinión se me ocurre dos cosas: primero, el autor desconoce de lo que habla (poco conocimiento en la materia o está desinformado); y segundo, el autor utiliza dicho vocabulario como una forma de ayudar al lector asociar las ideas y conceptos que se aplican en otros lenguajes. adicionalmente, pienso que la forma de la sintaxis introduce confusión de conceptos a algunos lectores. por ejemplo, en php $array['key'] denota que se trata de un array asociativo. como puedes ver, la sintaxis es exactamente igual a la de javascript. no obstante, tiene un significado completamente distinto, significa accesar/crear una propiedad de un objeto en particular. hay que tener en cuenta que la sintaxis de corchetes no es nada más que una forma alterna a la sintaxis de punto. en el caso de los arrays, si javascript determina que el valor dentro de los corchete no forma un índice válido, entonces lo considera como un accesor de propiedades.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 24/05/2012 a las 07:42 Razón: haciendo párrafos ‒ recomendacion de @aijoona =P
  #10 (permalink)  
Antiguo 24/05/2012, 20:25
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

Hola zerokilled, lamento incurrir en un tema que seguro ya han tratado muchas veces, mi confusión pasaba por la sintaxis de corchetes y su similitud con los arrays asociativos en otros lenguajes.

Tal como dices, uso php y por alguna razón asocié que debía trabajar del mismo modo en javascript.

Dos modos de hacer lo mismo me parecía raro (usar sintaxis de corchetes o de punto para añadir/acceder a una propiedad), sumado a que librosweb fue el material con el que me formé, me costaba entender porque el autor hacía semejante afirmación.

Tu exposición es muy clara y despeja mis dudas. Gracias.
  #11 (permalink)  
Antiguo 24/05/2012, 21:04
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

Cita:
Dos modos de hacer lo mismo me parecía raro (usar sintaxis de corchetes o de punto para añadir/acceder a una propiedad)...
mírale el lado útil. con la sintaxis de corchete puedes crear propiedades al vuelo, cosa que no puedes hacer con la sintaxis de punto. adicionalmente, con la sintaxis de corchete no estás limitado a la norma de identificadores válidos. es decir, la norma de que los identificadores (nombre de variables o funciones) deben comenzar por A-Za-z_$. de hecho, incluso puedes hacer cosas más bizarra como usar valores distinto a los strings.

Código:
var literal = {'0cero': 'comienza por 0'};
literal["(*)"] = 'una propiedad extraña usando simbolos';
console.log(literal["0cero"], literal["(*)"]);

var weird = {};
weird[literal] = "el key o nombre de propiedad es un objeto";
console.log(weird[literal]);
recuerdo que por ahí hay un tema en que señale esta característica y creo tiene más ejemplos... pero no recuerdo cual tema fue. no obstante, aclarar que funciona porque en realidad lo que sucede es que javascript convierte el dato a string y utiliza ese string como nombre para la propiedad. por ejemplo, en lugar literal intenta pasarle otro objeto genérico.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 24/05/2012 a las 21:25
  #12 (permalink)  
Antiguo 25/05/2012, 02:39
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

Gracias nuevamente zerokilled, la verdad desconocía la posibilidad de crear identificadores "fuera de regla" con la sintaxis de corchetes.
Con sintaxis de punto también podemos añadir propiedades al vuelo:
Código Javascript:
Ver original
  1. var obj = {bool:true,number:5};
  2. obj.str = "str";
  3. obj["arr"] = [0,false,""];
  4. for(p in obj){
  5.     console.log(p);
  6. }
  7. //bool
  8. //number
  9. //str
  10. //arr
  #13 (permalink)  
Antiguo 25/05/2012, 17:56
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 5 meses
Puntos: 317
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

Interesante debate. Yo tampoco sé si lo hablaron antes; seguro que sí, pero no recuerdo.

Muchas veces puse eso de "array asociativo". Seguramente fue una burrada.
¿Se lo podrá llamar "pseudo array asociativo", como vi en alguna parte? Sería una forma de ser más precisos, y no afectaríamos tanto a los que usan buscadores ni confundiríamos con algún nombre totalmente distinto a los que estén aprendiendo.

Digo, si a nadie le parece mal la sugerencia.
  #14 (permalink)  
Antiguo 25/05/2012, 20:55
Avatar de cristian_cena
Colaborador
 
Fecha de Ingreso: junio-2009
Mensajes: 2.244
Antigüedad: 14 años, 10 meses
Puntos: 269
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

No me parece una buena idea. Supongo Javier Eguíluz hace una analogía entre los objetos de javascript y los arrays asociativos de php (estimo porque también escribió unas guías de symfony) puesto que ambos son contenedores de pares clave/valor. Esta manera de explicar el tema es a mi parecer mala, ya que aporta confusión al instalar la duda de si los arrays asociativos existen en javascript o no. Tal vez dicha analogía pueda servir para desarrolladores experimentados pero para casos como el mío, diseñadores que se meten al mundo de la programación, lo veo mal, es decir, explicar un lenguaje desde las características de otro y no desde sus propias características.
  #15 (permalink)  
Antiguo 26/05/2012, 07:17
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años
Puntos: 343
Respuesta: No entiendo como funciona este bucle en javascript. ¿alguien puede explica

En JavaScript un Array es una lista y un Object es un mapa.

Mal por PHP que hace uso de los arrays para ambos tipos de colecciones (lista y mapa)
__________________
blog | @aijoona

Etiquetas: bucle, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:41.