Strings en JavaScript: trabajar texto sin errores sutiles

Última actualización el
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, toLowerCase y, si aplica, normalize.
  • Usa template literals para mensajes con variables.
  • Usa includes, startsWith y endsWith cuando la intención sea simple.
  • Guarda siempre el resultado de los métodos, porque los strings son inmutables.
  • Ten cuidado con length si 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.