Métodos de primitivos en JavaScript
Aprende cómo los primitivos de JavaScript como strings, números, booleanos, símbolos y bigints pueden llamar métodos mediante envoltorios de objeto temporales, con ejemplos ejecutables.
Introducción a los primitivos y objetos en JavaScript
En JavaScript, casi todo lo que escribes involucra un primitivo o un object. Comprender la diferencia — y el ingenioso truco que permite a los primitivos comportarse como objetos — es uno de los fundamentos del lenguaje.
Un primitivo es el tipo de valor más simple e indivisible. Existen siete tipos primitivos: números, strings, booleanos, undefined, null, símbolos y bigints. Un object es una colección de propiedades y métodos.
Aquí está el enigma que esta página resuelve: un string es un primitivo sin métodos, pero "hello".toUpperCase() funciona. ¿Cómo puede un valor que no tiene métodos llamar a un método? La respuesta son los envoltorios de objeto, y este capítulo explica exactamente cómo funcionan.
Esta página cubre qué hace especiales a los primitivos, cómo JavaScript los envuelve brevemente para que puedas llamar métodos, los métodos disponibles para cada tipo primitivo, y el error común de usar new con un constructor de primitivo.
Qué hace únicos a los primitivos
Los primitivos se diferencian de los objetos en tres aspectos importantes.
1. Inmutabilidad. Una vez que se crea un valor primitivo, no puede cambiarse. Una operación sobre un string nunca edita el string original en su lugar — devuelve un string completamente nuevo. Intentar asignar un carácter no hace nada (y lanza un error en modo estricto):
2. Almacenados por valor. Un primitivo se guarda directamente en la variable. Cuando lo copias, copias el valor en sí, por lo que las dos variables son completamente independientes:
Los objetos, en cambio, se almacenan por referencia — copiar la variable solo copia un puntero al mismo object.
3. Simples y ligeros. Un primitivo no tiene propiedades ni métodos propios, lo que lo hace rápido de crear y comparar. Un boolean como let flag = true; es simplemente un valor, sin ninguna de las cargas que tendría un object.
Los objetos en JavaScript: un contraste
Los objetos son la estructura más compleja. A diferencia de los primitivos, son:
- Mutables — su contenido puede cambiarse después de la creación.
- Tipos por referencia — los objects se almacenan y copian por referencia, no por valor.
- Versátiles — pueden contener funciones, arrays y otros objetos.
Cómo los primitivos llaman métodos: los envoltorios de objeto
¿Cómo funciona entonces "hello".toUpperCase() si el string no tiene métodos? Cuando accedes a una propiedad o método en un primitivo, JavaScript:
- Crea un object envoltorio temporal del tipo correspondiente que contiene el valor primitivo.
- Lee el método o propiedad solicitado de ese envoltorio.
- Lo ejecuta y devuelve el resultado.
- Descarta el object envoltorio de inmediato.
Todo esto ocurre entre bastidores y está muy optimizado por el motor, por lo que es efectivamente gratuito. La conclusión clave: el primitivo en sí nunca se cambia y nunca se convierte permanentemente en un object — el envoltorio existe solo durante esa única expresión.
Los constructores envoltorio
Cinco tipos primitivos tienen un constructor envoltorio incorporado correspondiente que proporciona sus métodos:
- String — para primitivos de tipo string.
- Number — para valores numéricos.
- Boolean — para valores boolean.
- Symbol — para símbolos.
- BigInt — para bigints.
null y undefined no tienen envoltorio, por lo que acceder a una propiedad en ellos lanza un TypeError (por ejemplo, null.toString() falla).
Métodos de string
Los strings exponen un amplio conjunto de métodos a través del envoltorio String. Aquí algunos de ellos se combinan para poner en mayúsculas la primera letra de cada palabra:
Observa que length es una propiedad, no un método, por lo que no lleva paréntesis. toUpperCase() devuelve un nuevo string y deja greeting intacto, fiel a la regla de inmutabilidad anterior.
Métodos de número
Los números obtienen métodos del envoltorio Number. Uno frecuente es toFixed(), que redondea a un número fijo de decimales:
Dos cosas a tener en cuenta. Primero, toFixed() devuelve un string, no un número — typeof (3.14159).toFixed(2) es "string". Segundo, para llamar a un método directamente en un literal numérico necesitas paréntesis adicionales o un espacio: 255..toString(16) también funciona, pero 255.toString(16) es un error de sintaxis porque el analizador lee el primer punto como punto decimal.
Métodos de boolean
Los booleanos pueden usar el envoltorio Boolean, más frecuentemente solo toString():
Métodos de Symbol
Los símbolos, un tipo primitivo único, obtienen métodos del envoltorio Symbol:
Debes llamar a toString() explícitamente aquí — los símbolos deliberadamente no se convierten automáticamente a string en contextos de string (como "" + sym), lo que de otro modo lanzaría un TypeError.
Métodos de BigInt
BigInt, diseñado para enteros demasiado grandes para el tipo Number regular, obtiene métodos del envoltorio BigInt:
El valor se pasa como string aquí porque escribirlo como literal numérico excedería el rango de enteros seguros y perdería precisión antes de que BigInt lo vea.
El error común: nunca uses new con envoltorios de primitivos
JavaScript permite construir un object envoltorio manualmente con new Number(1), new String("x") o new Boolean(false) — pero casi nunca deberías hacerlo. Un envoltorio creado con new es un object real, y todo object es truthy, incluido uno que envuelve false:
Esta es una fuente clásica de errores. Llamar al constructor sin new es correcto y útil — Number("42"), String(123) y Boolean(value) realizan una conversión de tipo simple y devuelven primitivos, no objetos.
Resumen
- Los primitivos son valores simples e inmutables almacenados por valor; los objetos son mutables y se almacenan por referencia.
- Llamar a un método en un primitivo funciona porque JavaScript lo envuelve en un object temporal, ejecuta el método y luego descarta el envoltorio.
String,Number,Boolean,SymbolyBigIntproporcionan los métodos;nullyundefinedno tienen envoltorio y lanzan un error si accedes a una propiedad.- Usa las funciones envoltorio sin
newpara la conversión de tipos. Nunca usesnewpara crear objetos envoltorio en el código cotidiano — siempre son truthy y se comportan de forma inesperada.
A continuación, explora los métodos de cada tipo en profundidad en strings, números y bigint.