Strings, Unicode y template literals en JavaScript | Nicolás Garzón
Un string es una secuencia inmutable de unidades de código UTF-16.
JavaScript
Copiar const name = "Nicolás" ; JavaScript
Copiar const single = 'Hello' ;
const double = "Hello" ;
const template = ` Hello ` ; Las tres formas crean valores string. Los template literals añaden interpolación y texto multilínea.
JavaScript
Copiar const text = "hello" ;
text[ 0 ] = "H" ; No modifica el string. Los métodos producen valores nuevos.
JavaScript
Copiar const updated = text. toUpperCase ( ) ; JavaScript
Copiar "A" . length;
"😀" . length; El emoji necesita un surrogate pair. length no cuenta necesariamente caracteres percibidos.
JavaScript
Copiar const text = "😀A" ;
text[ 0 ] ;
text. at ( 0 ) ;
text. at ( - 1 ) ; Indexar puede separar un surrogate pair.
JavaScript
Copiar [ ... "😀A" ] ;
El iterador de string avanza por code points, no por unidades UTF-16 individuales.
JavaScript
Copiar "😀" . codePointAt ( 0 ) ;
String. fromCodePoint ( 0x1f600 ) ; Un símbolo visible puede contener varios code points:
Emoji con tono de piel.
Banderas.
Letras con marcas combinadas.
Secuencias unidas mediante ZWJ.
JavaScript
Copiar const segmenter = new Intl. Segmenter ( "es" , {
granularity : "grapheme" ,
} ) ;
const graphemes = [
... segmenter. segment ( text) ,
] . map ( ( item ) => item. segment) ; Usa grafemas cuando la interacción humana necesita contar, cortar o seleccionar caracteres visibles.
JavaScript
Copiar "line 1\nline 2" ;
"tab\tvalue" ;
"quote: \"hello\"" ;
"\u{1F600}" ; La forma \u{...} expresa un code point completo.
JavaScript
Copiar const message = ` Hello, ${ user. name} ` ; La expresión se evalúa y convierte a string.
JavaScript
Copiar const priceLabel = ` Total: ${ formatPrice ( total) } ` ; No insertes texto no confiable dentro de HTML solo porque utilizas template literal; la interpolación no sanitiza.
JavaScript
Copiar function tag ( strings, ... values ) {
return { strings, values } ;
}
const result = tag` Hello ${ name} ` ; La función recibe partes literales y valores por separado. Librerías pueden usarlas para escaping, estilos o consultas, pero la seguridad depende de la implementación del tag.
JavaScript
Copiar text. includes ( "JavaScript" ) ;
text. startsWith ( "Hello" ) ;
text. endsWith ( "world" ) ;
text. indexOf ( "value" ) ; includes expresa pertenencia; indexOf aporta posición.
JavaScript
Copiar text. slice ( start, end) ; slice acepta índices negativos. Opera por unidades UTF-16, por lo que puede cortar una secuencia Unicode en un punto inválido.
JavaScript
Copiar text. replace ( "old" , "new" ) ;
text. replaceAll ( "-" , " " ) ; Con string, replace cambia la primera coincidencia. Con RegExp global puede cambiar varias.
Dos strings visualmente iguales pueden usar secuencias distintas.
JavaScript
Copiar const first = "é" ;
const second = "e\u0301" ;
first === second;
first. normalize ( ) === second. normalize ( ) ; Normalizar es útil antes de comparaciones específicas, búsquedas o identificadores, pero el formulario correcto depende del dominio.
JavaScript
Copiar text. toLowerCase ( ) ;
text. toLocaleLowerCase ( "tr" ) ; Las reglas de mayúsculas pueden depender del idioma. Para comparación de texto de usuario, considera Intl.Collator.
JavaScript
Copiar const collator = new Intl. Collator ( "es" , {
sensitivity : "base" ,
} ) ;
names. toSorted ( collator. compare) ; Los operadores comparan por orden de unidades, no por reglas de diccionario.
JavaScript
Copiar text. isWellFormed ( ) ;
text. toWellFormed ( ) ; Ayudan a detectar o sustituir surrogates aislados antes de interoperar con codificaciones que requieren Unicode válido.
Un string no es un array de bytes. Para convertir texto a UTF-8 usa APIs del entorno:
JavaScript
Copiar const bytes = new TextEncoder ( ) . encode ( text) ;
const decoded = new TextDecoder ( ) . decode ( bytes) ; JavaScript
Copiar function truncateGraphemes ( value, maximum ) {
const segmenter = new Intl. Segmenter ( "es" , {
granularity : "grapheme" ,
} ) ;
return [ ... segmenter. segment ( value) ]
. slice ( 0 , maximum)
. map ( ( { segment } ) => segment)
. join ( "" ) ;
} No rompe emojis o combinaciones visibles en la mitad.
Creer que length siempre cuenta caracteres visibles.
Cortar emojis mediante índices UTF-16.
Comparar texto de usuario con orden Unicode simple.
Confundir string con bytes.
Esperar que un template literal haga escaping.
Ignorar normalización.
Usar toLowerCase como solución universal de comparación internacional.
Mutar una posición de string.
Los strings son inmutables.
Se almacenan como unidades UTF-16.
Code point y grafema no son lo mismo.
El iterador maneja code points.
Intl.Segmenter trabaja con segmentos humanos.
Template literals interpolan, pero no sanitizan.
normalize ayuda con representaciones equivalentes.
Intl.Collator aporta comparación sensible al idioma.
¿Por qué "😀".length devuelve 2, pero [..."😀"].length devuelve 1?
Respuesta length cuenta unidades UTF-16; el iterador reconoce el surrogate pair como un solo code point.
Number, punto flotante y Math explica precisión, límites y cálculos numéricos.