La diferencia, en la mayoría de los lenguajes, es que un for itera sobre cosas que no tienen porqué existir, y nos garantiza el orden de acceso; por su parte, un for each itera sobre cosas que, obligatoriamente, han de existir. Además, no nos garantiza el orden en el que se accede
el for in nos permite iterar solo objetoy el for of nos permite iterar solo arrays