Comportamiento extraño en Javascript mejorado para…en bucle

Estoy haciendo un Javascript juego con el lienzo de la etiqueta, y estoy usando un bucle for mejorado para actualizar las posiciones de los jugadores.

En breve:

var actors = new Array();

var player = new Actor(0, 0, img);

actors[0] = player;

function update_positions() {
    //position 1
    for(var a in actors) {
        //position2
        a.xpos += a.xvel;
        a.ypos += a.yvel;
    }
}

Justo fuera del bucle for, en la posición 1, puedo acceder a el valor correcto de los actores[0].xvel. Dentro del bucle for en la posición 2, un.xvel es indefinido. Puede que alguien me explique lo que está sucediendo?

InformationsquelleAutor Spencer | 2009-12-11

5 Kommentare

  1. 87

    La en declaración está destinado a ser utilizado para iterar sobre propiedades del objeto, mirando el código parece que actors es una Matriz (se establece el elemento inicial con el índice de 0).

    Esta declaración también le suben el prototipo de la cadena, si se ha extendido el Array.prototype esas propiedades se repetirá, y también el orden de iteración no está garantizada.

    Yo recomendaría usted para evitar problemas y repetir un bucle for:

    for (var i = 0; i < actors.length; i++) {
        actors[i].xpos += actor.xvel;
        actors[i].ypos += actor.yvel;
    }

    Si estoy equivocado, y actors no es un Array, le recomiendo que utilice el hasOwnProperty método, para asegurarse de que la propiedad existe en el objeto en sí, no en algún punto de la cadena de prototipos:

    for (var name in object) {
      if (object.hasOwnProperty(name)) {
        //
      }
    }
  2. 4

    parece que estás intentando acceder a las propiedades del objeto en el nombre, no el valor aquí. el índice, en este caso, ‘0’, se le asigna a la ‘a’ en el para/en bucle.

    lo que quiero hacer es acceder al valor de la miembro de la matriz, es decir: los actores[a].

    intente esto:

    for(var a in actors) { //a=0 the first time around the loop,  
        actor = actors[a]; //same thing as actors[0];
        actor.xpos += actor.xvel;
        actor.ypos += actor.yvel;
    }
  3. 2

    La for (x in y) construir itera a través de los índices de un array, no a sus miembros.

  4. 0

    Otra opción es utilizar el subrayado biblioteca:

    _.each( actors, function(a) {
        a.xpos += a.xvel;
        a.ypos += a.yvel;
    });

    o si usted no desea utilizar el subrayado, pero están usando JQuery de todos modos, entonces usted puede hacer:

    $.each( actors, function(i, a) {
        a.xpos += a.xvel;
        a.ypos += a.yvel;
    });

    Una buena característica de este patrón funcional de la iteración es que se puede utilizar var declarar las variables en el bucle que se encuentran en el ámbito del cuerpo del bucle, lo que ayuda a evitar la picadura de los impares variable reglas de ámbito de JavaScript.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea