buenas,
Cita: Diria que este condicional no tien mucho sentido
if (balls[i])
balls[i]={ speed : 100 };
y eso no es un booleano, no?
cito el texto porque sospecho que hay una especie de duda. en este caso particular todos generan true porque un objeto convertido a boolean siempre devuelve true. no obstante, en algo tienes razón... la condición carece de sentido ya que no existe la posibilidad de un false, asumiendo que siempre se itera por la longitud del array y que todos los elementos sean un objeto.
el problema surge en esta línea.
Código:
for (i = 0; i < numberOfFireballs; i++) {
balls[i] = fireball;
};
específicamente porque le estás asignando el mismo objeto a todos los elementos del array. es decir, cada elemento es una referencia de las demás. en javascript, los objetos no se asignan como copia sino como referencia. de modo que múltiples contenedores accesan al mismo objeto y por ende cuando uno altera el estado en los demás se refleja.
Código:
var obj = {prop: "value"};
var ref = obj;
ref.prop = 'modified';
alert(obj.prop); // modified;