«Reemplazar todo» en JavaScript: desde parches antiguos hasta el estándar moderno
Imagina esta situación: estás escribiendo un chatbot y un usuario envió un mensaje con el error tipográfico «holaA». Necesitas reemplazar todas las ocurrencias de «A» por «a». O estás analizando un archivo CSV y quieres eliminar todos los espacios sobrantes. ¿Suena simple? En JavaScript, hasta hace poco, esto era un verdadero dolor de cabeza.
La pregunta «How do I replace all occurrences of a string?» es una de las más populares en Stack Overflow. Miles de desarrolladores tropezaban con esta tarea aparentemente elemental. ¿Por qué? Porque el viejo replace() por defecto reemplaza solo la primera coincidencia. ¿El truco? Usar una expresión regular con la bandera g. Pero en 2025 tenemos una solución mucho más elegante.
En este artículo analizaremos todas las formas actuales de reemplazar todas las ocurrencias de una subcadena en JavaScript: desde los clásicos hasta los estándares modernos. Aprenderás qué método elegir para diferentes tareas y por qué replaceAll es tu nuevo mejor amigo.
¿Por qué el viejo replace() no funciona «de fábrica»?
Comencemos con la decepción que sufría todo principiante:
let text = "Me encanta JavaScript, ¡JavaScript es genial!";let newText = text.replace("JavaScript", "Python");console.log(newText); // Salida: "Me encanta Python, ¡JavaScript es genial!"¿Ves? Solo se reemplazó la primera ocurrencia. El método String.prototype.replace() está diseñado así históricamente. Si le pasas una cadena (no una expresión regular), busca y reemplaza la primera coincidencia. Para muchos lenguajes (Python, Java) esto fue un shock. Pero JavaScript vivió mucho tiempo con esta limitación.
Por cierto, si buscas la respuesta a la pregunta «how do I replace all occurrences of a string in JavaScript» en español, debes saber que hasta 2021 la única forma confiable era usar RegExp.
Forma n.º 1: Clásica — replace() + RegExp (sigue siendo relevante)
Este es el método «del abuelo» que funciona en todos los navegadores, incluido Internet Explorer (sí, todavía existe en algún lugar). El secreto es la bandera g (global).
let text = "El gato se comió al ratón. El gato está contento.";let newText = text.replace(/Gato/g, "Perro");console.log(newText); // "El Perro se comió al ratón. El Perro está contento."Ventajas:
- Funciona en todas partes (IE11, versiones antiguas de Node.js)
- Potente: puedes usar grupos de captura, bandera
i(insensible a mayúsculas/minúsculas) - Muy rápido
Desventajas:
- Hay que escapar caracteres especiales (punto, asterisco, etc.)
- Código menos legible para principiantes
- No es adecuado si la cadena a reemplazar es dinámica (proviene del usuario)
Si necesitas reemplazar una cadena dinámica, usa el constructor RegExp:
function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');}
let userInput = "hola.mundo";let text = "hola.mundo, ¿cómo estás? hola.mundo!";let safePattern = escapeRegExp(userInput);let result = text.replace(new RegExp(safePattern, 'g'), 'adiós.todos');console.log(result);// "adiós.todos, ¿cómo estás? adiós.todos!"La función escapeRegExp es un ritual obligatorio si trabajas con entrada del usuario. De lo contrario, el punto en la cadena se interpretará como «cualquier carácter».
Forma n.º 2: Estándar moderno — replaceAll() (ES2021+)
A partir de ES2021 (ECMAScript 2021), tenemos String.prototype.replaceAll(). Esta es la respuesta a la pregunta «how do I replace all occurrences of a string in JavaScript» que se esperó durante años.
let text = "Me encanta JavaScript, ¡JavaScript es genial!";let newText = text.replaceAll("JavaScript", "Python");console.log(newText); \