Una variable declarada con la palabra clave const no se puede reinicializar. Entonces, ¿por qué la palabra clave const funciona para for of loop? Por ejemplo, si tengo un ciclo como for(const x of array){...code here...} . ¿Por qué funciona en lugar de arrojar un error como en el caso de for(const x=0;x<array.length;x++){...code here...} ?
¿Se debe al hecho de que el último for loop mencionado reinicializa el valor de la variable x pero, solo lo declara una vez, en otras palabras, la variable x se declara para todo el ciclo?
Pero, ¿qué pasa con el bucle for of ? ¿Está redeclarando el valor de x cada vez que se realiza una iteración?
Si no es así, ¿qué factores hacen for of funcione el bucle anterior mencionado?
En el segundo ejemplo, establece const x en cero y luego intenta modificar el valor con x++. Como su nombre lo indica, no puede modificar el valor de una constante después de declararla. Si intentara x++ dentro del ciclo for/of, también generaría un error. Presumiblemente, su bucle for/of solo lee el valor de x y no lo altera (digo presumiblemente porque no compartió el código para esta parte).
El bucle for tradicional es un elemento básico de muchos idiomas y, a menudo, toma una forma como
for(x=0;x<array.length;x++) Esta construcción funciona debido al hecho de que la x es visible no solo dentro del bucle, sino también entre iteraciones , por lo que x++ funciona. Los bucles for de JavaScript fueron diseñados para funcionar de manera similar. Una variable declarada en la declaración de un bucle for es visible en todo el cuerpo del bucle y entre iteraciones. (las cosas se vuelven un poco más extrañas con let , pero eso no es realmente relevante para el problema aquí)
for..of es una bestia completamente diferente. A pesar de que usa la misma palabra - for - que la construcción for(;;) , funciona de manera bastante diferente. for..of invoca el iterador del objeto para cada iteración, y los valores devueltos por el iterador no se inicializan antes del bucle; son específicos de cada iteración , por lo que tener algo como x++ no tendría mucho sentido.
for..of , en pseudocódigo:
iterator = getIteratorFromObject(); loop { if (iterator.done) break; nextValue = iterator(); // execute loop body with nextValue } El valor devuelto por el iterador, cuando se inicializa con const (que tiene alcance de bloque, no alcance de función), tiene sentido que se limite solo al bloque de esa iteración en particular. (Si intentara reasignar el identificador const , al igual que en un bucle for tradicional, obtendría un error).
A diferencia de un for tradicional, en realidad no hay ningún valor inicial para inicializar (aparte del iterador, pero el consumo del iterador se abstrae detrás del motor de JavaScript).