Día 5 de 24: reverseString
5 de diciembre de 2025

Día 5 de 24: reverseString

Las 24 funciones antes de navidad

Por Asdrúbal Chirinos

Hoy seguimos avanzando en nuestra serie, buscando cada día herramientas útiles que hacen más cómodo nuestro trabajo diario. En la entrega anterior vimos cómo generar slugs limpios para URLs, y ahora nos movemos a un terreno diferente: manipular texto de manera segura. La función de hoy se encarga de algo que parece simple, pero que en la práctica puede volverse complejo cuando entran en juego emojis, grafemas y caracteres compuestos.

Día 4 de 24: slugify Las 24 funciones antes de navidad 4 de diciembre de 2025
Día 4 de 24: slugify

reverseString

Esta función invierte una cadena respetando su estructura interna. A diferencia de soluciones tradicionales que simplemente voltean los caracteres, aquí se tiene en cuenta el tratamiento correcto de grafemas completos. Esto es especialmente útil cuando se trabaja con textos que incluyen emojis, secuencias con ZWJ o caracteres Unicode combinados.
Lo que la hace interesante es su capacidad para usar Intl.Segmenter cuando está disponible, lo que mejora notablemente la precisión en entornos modernos. En sistemas donde este soporte no existe, la función recurre a invertir por puntos de código, manteniendo un comportamiento confiable.

En definitiva, es ideal para cualquier proyecto que requiera trabajar con cadenas visualmente coherentes y correctamente ordenadas al invertirlas.

Código de la función

/**
 * Invierte una cadena por puntos de código. Usa Intl.Segmenter si disponible
 * para intentar preservar grafemas compuestos (ej. emojis con ZWJ), sino se limita a code points.
 * @param {string} str
 * @returns {string}
 */
export function reverseString(str) {
  if (typeof str !== 'string') return '';
  if (typeof Intl !== 'undefined' && Intl.Segmenter) {
    const seg = new Intl.Segmenter('es', { granularity: 'grapheme' });
    const parts = [...seg.segment(str)].map(s => s.segment);
    return parts.reverse().join('');
  }
  const codePoints = Array.from(str);
  return codePoints.reverse().join('');
}

Cómo usarla

Caso básico

reverseString('Hola');  
// Resultado: 'aloH'

Con emojis

reverseString('Hola 👋🙂');  
// Resultado: '🙂👋 aloH'

Con caracteres combinados

reverseString('café');  
// Resultado esperado con Segmenter: 'éfac'

Escenario sin soporte para Intl.Segmenter

Si se ejecuta en un entorno antiguo, igual obtendrás una inversión coherente basada en puntos de código.


Cada día avanzamos un paso más en esta colección de utilidades que buscan mejorar la calidad y facilidad de nuestros desarrollos. Mañana continuaremos con otra función que complementa este recorrido navideño.

Compartir:

¿Te gustó este artículo? Apoya mi trabajo y ayúdame a seguir creando contenido.

Cómprame un café