Escribamos un poco de codigo para recorrer nuestro nuevo array con un for .. in:

var arr = [];
arr[1] = 'chau';
arr[2] = 'hola';

for (var ele in arr) {
    //1era iteración: ele === 1

    //2da iteración: ele === 2

    //demas iteraciones: metodos y propiedades del array.

} 

Suponiendo que esperamos recorrer cada elemento del array y utilizar su valor, por qué el código anterior no funciona como esperamos?
El for each en javascript itera enumerando las propiedades de un objeto, pero por qué nos devuelve cada index en vez de su contenido?
En javascript cada objeto es realmente un array de propiedades, por ejemplo:

var persona = {
    nombre : 'Pepe',
    edad: 25
};

if (persona.nombre === persona['nombre'])
   console.log('loco, no?'); 

y si ahora hacemos:

for (var p in persona){
    //1er iteración: p === 'nombre'

    //2da iteración: p === 'edad'

} 

Pero esto no es lo único que deberiamos tener en cuenta, tambien está el caso donde prototipamos el Array:

Array.prototype.unMetodoNuevo = function(){ alert('nuevo metodo');};
var arr = [];

for (var ele in arr){
    //iteraciones: metodos y propiedades del array.

    //ultima iteración: ele será la function unMetodoNuevo

} 

Ese es un problema porque no es lo que estamos esperando, queremos que itere sobre los elementos del array, no sus propiedades.
El punto es que nunca estamos seguros si alguna libreria que estemos usando prototipó el Array (por ej. MooTools realiza prototypes de Array internamente).
Mi recomendación, entendiendo como se comportan los arreglos y el for..in en javascript, es utlizar el for loop cuando realicemos iteraciones sobre un array:

var arr = [];
arr[1] = 'hola';
arr[2] = 'chau';

for (var i=0; i < arr.length; i++){
    //i === 0: arr[0] === undefined;

    //i === 1: arr[1] === 'hola';

    //i === 2: arr[2] === 'chau';

} 

De esta manera leemos el array de una forma segura y evitando comportamientos inesperados.

Les dejo un jsFiddle para que prueben los casos e intenten nuevas cosas.