var string = "abc𝑚"; var lastchar = string.substr(string.length - 1); console.log(lastchar);esto vuelve? en lugar de 𝑚
En JavaScript, una cadena es una serie de unidades de código UTF-16 (detalles en mi publicación de blog ¿Qué es una cadena? ). En UTF-16, ese último glifo (en términos generales, "carácter") requiere dos unidades de código (que se combinan para formar un solo punto de código), por lo que la longitud de la cadena es 5.
Hasta ES2015, no había mucho JavaScript incorporado para ayudarlo con esto, pero cuando se introdujo la iterabilidad, las cadenas se hicieron iterables e iteran sobre sus puntos de código , no unidades de código. Las operaciones de propagación utilizan la iteración, por lo que puede distribuir esa cadena en una matriz para llegar a sus puntos de código:
const string = "abc𝑚"; console.log(string.length); // 5 const chars = [...string]; console.log(chars.length); // 4 const lastchar = chars.slice(chars.length - 1).join(""); console.log(lastchar);Ese es solo un ejemplo para demostrar la distinción y cómo puede usar los puntos de código con bastante facilidad.
Incluso los puntos de código no son necesariamente glifos porque algunos puntos de código se combinan con otros para formar un solo glifo. (Por ejemplo, en devanagari , la palabra para el idioma es "देवनागरी", que parece cinco glifos para los lectores nativos, pero tiene ocho puntos de código porque algunos de ellos están escritos con un glifo de sílaba base modificado por un punto de código de vocal después). Hay un nuevo Intl.Segmenter en desarrollo que también ayudaría con esas situaciones.