buenas...
 
@cronos, que tal! estaba observando el codigo y entiendo la idea que tienes: restaurar el array por el original cuando se vacia. lo cierto es que no ocurre asi puesto que los tipos de datos complejos se pasan como referencia y no copia. es decir, 
arr es una referencia de 
fdw. para hacer una copia de un array puedes utilizar cualquier funcion que devuelva un nuevo array, el mas apropiado 
concat.
Código:
 var a = [true, 'string', 0], b = a.concat(); // crear array y copiar ;
a.shift(); // eliminar un elemento de un array ;
alert("a: "+ a +"\nb: "+ b);