Estoy experimentando un comportamiento extraño que creo que está relacionado con el alcance, pero no puedo explicar por qué sucede.
Así que esta es la pieza de código problemática. Estoy tratando de Camel Case algunas palabras y diferenciar entre texto separado por guiones y guiones bajos. Ignore el hecho de que el algoritmo aún no es completamente correcto, ese no es el punto. Esta es la etapa en la que noté el problema.
function toCamelCase(str){ let isDash = false for (let char in str) { if (char === "-") { isDash = true } } if (isDash) { return str.split("-").map(word => word[0].toUpperCase() + word.slice(1, word.length + 1)).join("") } else { return str.split("_").map(word => word[0].toUpperCase() + word.slice(1, word.length + 1)).join("") } } let result = "why-false" console.log(toCamelCase(result))Entonces isDash determina qué tipo de separador contiene el texto. Obviamente, puedo usar una función de flecha en lugar de este enfoque, y funcionaría perfectamente. Algo como esto:
let isDash = () => { for (let char in str) { if (char === "-") { return true }Pero no puedo entender por qué el ejemplo anterior no funciona tan bien. He leído sobre el alcance y debería ser posible reasignar a esa variable si se definió en un nivel superior. Incluso si definí isDash fuera de la función, todavía no funcionó. Su valor sigue siendo siempre el inicial: false. ¿Por qué la instrucción if no cambia su valor a verdadero?
let x = [1, 4, 5, 7] let txt = 0 let working = "no" for (let i in x) { txt += x[i] if (txt > 4) { working = "yes" } } console.log(working)Como puede ver, si escribo algo similar para demostrar si es posible usar la variable en una declaración if anidada, funciona bien y el trabajo registrará sí. ¿Que me estoy perdiendo aqui? Realmente agradecería algo de ayuda, esto realmente es un callejón sin salida para mí y no habría pedido ayuda si hubiera podido resolverlo yo mismo. ¡Muchas gracias a cualquiera que pueda explicarme estas cosas!
El problema aquí es su bucle for:
for (let char in str) { if (char === "-") { isDash = true } } El ciclo for-in recorre índices o claves, no valores (puede probar esto haciendo console.log(char); en el ciclo). En su lugar, utilice un bucle for-of.
El problema es que está utilizando la instrucción for...in, que recorre los nombres de propiedades enumerables de un objeto.
for (let char in str) { if (char === "-") { isDash = true } }Puede usar la declaración for...of para iterar sobre cadenas y usar const si no va a reasignar la variable dentro del bloque.
De esta manera:
for (const char of str) { if (char === "-") { isDash = true } }Estoy bastante seguro de que la razón de esto es el uso de 'let' en lugar de 'var'. (Para ser honesto, no lo había visto usado antes de esta publicación...).
Consulte este artículo: https://www.google.com/amp/s/www.geeksforgeeks.org/difference- between -var-and-let-in-javascript/amp/
Y si esto soluciona su problema, lea más sobre las diferencias entre los dos.
Personalmente, siempre usaría var .