Strings en JavaScript: trabajar texto sin errores sutiles
Los strings parecen simples porque representan texto, pero en una aplicación real terminan apareciendo en todas partes: formularios, URLs, mensajes de error, búsquedas, nombres de usuario, datos de una API y contenido que se renderiza en pantalla. Por eso no alcanza con saber que se escriben entre comillas. Conviene entender cómo se crean, cómo se transforman y qué problemas aparecen cuando el texto viene de usuarios o servicios externos.
Formas de crear strings
JavaScript permite crear strings con comillas simples, comillas dobles y backticks:
const first = 'Hola';
const second = 'Hola';
const third = `Hola`;
Las tres formas crean texto, pero los backticks habilitan template literals. Son la opción más cómoda cuando necesitas interpolar valores o construir mensajes con varias líneas:
const user = 'Ansel';
const unread = 4;
const message = `Hola ${user}, tienes ${unread} mensajes sin leer.`;
En código moderno, los template literals suelen ser más legibles que concatenar con +, especialmente cuando hay varias variables.
Inmutabilidad: ningún método modifica el string original
Los strings en JavaScript son inmutables. Eso significa que métodos como trim, replace, toLowerCase o slice devuelven un nuevo string:
const rawEmail = ' ANSEL@example.com ';
const normalizedEmail = rawEmail.trim().toLowerCase();
console.log(rawEmail); // " ANSEL@example.com "
console.log(normalizedEmail); // "ansel@example.com"
Este detalle evita efectos secundarios raros, pero también obliga a guardar el resultado. Si llamas rawEmail.trim() y no usas el valor devuelto, no cambió nada.
Limpieza y normalización de entradas
Una buena parte del trabajo con strings consiste en preparar texto antes de compararlo o guardarlo. Un patrón típico para formularios es:
function normalizeSearch(value) {
return value.trim().toLowerCase();
}
const query = normalizeSearch(' React ');
console.log(query); // "react"
trim() elimina espacios al inicio y al final. toLowerCase() ayuda a comparar sin depender de mayúsculas. Para casos más avanzados, como comparar palabras con acentos, puedes usar normalize():
function removeAccents(value) {
return value.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
}
console.log(removeAccents('programación')); // "programacion"
Esto es útil en buscadores simples, filtros de posts o validaciones donde el usuario no debería fallar por escribir con o sin tilde.
Buscar texto: includes, startsWith y endsWith
Para preguntas simples, evita expresiones regulares innecesarias:
const filename = 'report.final.pdf';
console.log(filename.endsWith('.pdf')); // true
console.log(filename.includes('final')); // true
console.log(filename.startsWith('report')); // true
Estos métodos expresan intención de forma directa. Una regex tiene sentido cuando el patrón realmente es más flexible, por ejemplo validar una estructura o extraer varias partes.
Reemplazar texto
replace() cambia la primera coincidencia cuando recibe un string:
const text = 'JavaScript es raro. JavaScript es poderoso.';
console.log(text.replace('JavaScript', 'JS'));
// "JS es raro. JavaScript es poderoso."
Si necesitas reemplazar todas las apariciones, usa replaceAll() o una expresión regular global:
console.log(text.replaceAll('JavaScript', 'JS'));
// "JS es raro. JS es poderoso."
El detalle importa mucho cuando limpias datos, generas slugs o normalizas contenido importado desde otra fuente.
Cortar strings con intención
slice() es una forma segura y expresiva de tomar una parte:
const slug = 'javascript-strings-guide';
console.log(slug.slice(0, 10)); // "javascript"
console.log(slug.slice(-5)); // "guide"
Para separar texto por delimitadores, split() suele ser mejor:
const tags = 'JavaScript,Frontend,Web';
const list = tags.split(',').map((tag) => tag.trim());
console.log(list); // ["JavaScript", "Frontend", "Web"]
Este patrón aparece mucho al convertir texto plano en datos que puedas recorrer o renderizar.
Cuidado con length y Unicode
length cuenta unidades UTF-16, no siempre caracteres visibles. Con emojis o ciertos símbolos, puede sorprender:
console.log('a'.length); // 1
console.log('🔥'.length); // 2
Si necesitas contar caracteres percibidos por el usuario, convierte el string en array con Array.from():
console.log(Array.from('🔥').length); // 1
Para interfaces, límites de input y contadores de caracteres, esta diferencia puede afectar la experiencia.
Buenas prácticas
- Normaliza antes de comparar:
trim,toLowerCasey, si aplica,normalize. - Usa template literals para mensajes con variables.
- Usa
includes,startsWithyendsWithcuando la intención sea simple. - Guarda siempre el resultado de los métodos, porque los strings son inmutables.
- Ten cuidado con
lengthsi el texto puede incluir emojis o caracteres compuestos. - Evita construir HTML con strings si el contenido viene del usuario; usa APIs seguras del framework o del DOM.
Conclusión
Dominar strings no es memorizar métodos sueltos. Es entender cómo preparar texto, compararlo correctamente, transformarlo sin efectos secundarios y evitar errores silenciosos. En aplicaciones reales, ese cuidado se nota en búsquedas que funcionan mejor, formularios más confiables y datos más limpios.