Estoy tratando de invertir una cadena. Conozco la función .reverse y otros métodos en Js para hacerlo, pero quería hacerlo con este método de dos puntos.
El problema es que la cadena no se actualiza. ¿Hay algo de lo que no estoy al tanto de las cadenas? ¿Qué pasa aquí?
function reverseString(s) { let lengthOfStr = 0; if ((s.length - 1) % 2 == 0) { lengthOfStr = (s.length - 1) / 2 } else { lengthOfStr = ((s.length - 1) / 2) + 1; } let strLengthLast = s.length - 1; for (let i = 0; i <= lengthOfStr; i++) { let pt1 = s[i]; let pt2 = s[strLengthLast]; s[i] = pt2; s[strLengthLast] = pt1; console.log('----', s[i], s[strLengthLast]); strLengthLast--; } return s; } console.log(reverseString('hello'));A diferencia de C, las cadenas en JavaScript son inmutables, por lo que no puede actualizarlas indexándolas. Ejemplo:
let s = 'abc'; s[1] = 'd'; console.log(s); // prints abc, not adc Tendrías que hacer algo más extenso en lugar de s[i] = pt2; , como s = s.substring(0, i) + pt2 + s.substring(i + 1); , y de manera similar para s[strLengthLast] = pt1; (o combínelos en una expresión con 3 llamadas a substring ).
No estoy seguro de por qué no actualiza la cadena, pero si maneja el reemplazo como una matriz/lista, funciona de la siguiente manera:
function reverseString(s) { let lengthOfStr = 0; sSplit = s.split(""); if ((s.length - 1) % 2 === 0) { lengthOfStr = (s.length - 1) / 2 } else { lengthOfStr = ((s.length - 1) / 2) + 1; } let strLengthLast = s.length - 1; for (let i = 0; i <= lengthOfStr; i++) { let pt1 = sSplit[i]; let pt2 = sSplit[strLengthLast]; sSplit[i] = pt2; sSplit[strLengthLast] = pt1; console.log('----', sSplit[i], sSplit[strLengthLast],sSplit); strLengthLast--; } return sSplit.join(""); } console.log(reverseString('Hello'));devuelve: Hola => olleH
Como se explica en los comentarios, las respuestas y la documentación, las cadenas son inmutables en JavaScript.
La capacidad de asignar aparentemente un valor de propiedad a un valor de cadena primitivo es el resultado del diseño del motor JavaScript temprano que creaba temporalmente un objeto String a partir de cadenas primitivas al llamar a un método String.prototype en el primitivo. Si bien no se produjo un error al asignar una propiedad al objeto temporal, fue inútil ya que el objeto se descartó entre la llamada al método String y la reanudación de la ejecución del código de usuario.
La buena noticia es que esto se ha solucionado. Poniendo
"use strict";al comienzo de un archivo JavaScript o cuerpo de función hace que el compilador genere un error de sintaxis que indica que las "propiedades" de la cadena primitiva son de solo lectura.
Hay muchas formas de escribir una función para invertir cadenas sin llamar a String.prototype.reverse . aquí hay otro ejemplo
function strReverse(str) { "use strict"; let rev = []; for( let i = str.length; i--;) { rev.push(str[i]); } return rev.join(''); } console.log( strReverse("Yellow") ); console.log( strReverse("").length);