Estoy creando una función javascript simple que toma la entrada de una cadena y la rellena con el múltiplo de 8 más cercano. La función funciona, sin embargo, parece que el operador de módulo funciona de manera diferente en los bucles for. Por ejemplo:
var text = "abcdefghi" if(text.length % 8 !== 0){ var amt = 8 - (text.length % 8) for (let i = 0; i < amt; i++) { text = text + "#" } } console.log(text) Devoluciones: abcdefghi#######
Pero:
var text = "abcdefghi" if(text.length % 8 !== 0){ for (let i = 0; i < text.length % 8; i++) { text = text + "#" } } console.log(text) También devuelve: abcdefghi#######
Desde mi comprensión del operador de módulo text.length % 8 = 1 dada una entrada de cadena de 9 caracteres. Entonces, para rellenar la cadena para que tenga 16 caracteres, tendría que hacer 8 - (text.length % 8) = 7 . Cuando pongo eso en su propia variable para que amt = 7 , el bucle for se repite 7 veces y funciona correctamente. Sin embargo, cuando realizo la operación en el bucle for y elimino 8 - , también se repite 7 veces aunque text.length % 8 = 1 . ¿Alguien puede explicar qué está pasando aquí?
El ciclo for evaluará la longitud del texto cada vez que se ejecuta a través del ciclo. Entonces, si agrega un hashtag al final del texto en el ciclo, cuando evalúe la longitud nuevamente, verá que el texto es más largo que la última vez.
Entonces, básicamente, está agregando el texto en lugar de encontrar la longitud nuevamente, cuando obtiene la longitud del texto fuera del ciclo for, obtendrá una constante de la longitud y podrá usarla con precisión en el ciclo for.
Para ponerlo en un ejemplo, cuando haces la longitud constante, como hiciste en tu primer ejemplo fuera del ciclo for, tienes una ecuación como:
repeat until x = yPero si haces el cálculo dentro del bucle for, obtienes una ecuación como:
repeat until x = x + 1Eso simplemente no funciona porque x no se va a igualar a sí mismo + 1 si vuelve a calcular qué es x + 1 cada vez que incrementa x.