W3docs

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):

javascript— editable

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:

javascript— editable

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:

  1. Crea un object envoltorio temporal del tipo correspondiente que contiene el valor primitivo.
  2. Lee el método o propiedad solicitado de ese envoltorio.
  3. Lo ejecuta y devuelve el resultado.
  4. 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:

javascript— editable

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:

javascript— editable

Dos cosas a tener en cuenta. Primero, toFixed() devuelve un string, no un númerotypeof (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():

javascript— editable

Métodos de Symbol

Los símbolos, un tipo primitivo único, obtienen métodos del envoltorio Symbol:

javascript— editable

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:

javascript— editable

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:

javascript— editable

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, Symbol y BigInt proporcionan los métodos; null y undefined no tienen envoltorio y lanzan un error si accedes a una propiedad.
  • Usa las funciones envoltorio sin new para la conversión de tipos. Nunca uses new para 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.

Práctica

Práctica
¿Cuáles de los siguientes métodos son aplicables a los tipos de datos primitivos en JavaScript?
¿Cuáles de los siguientes métodos son aplicables a los tipos de datos primitivos en JavaScript?
Was this page helpful?