Saltar al contenido principal
06Tipos de datos primitivos

Métodos en tipos primitivos

Clase 1 de 55 min de lectura

En JavaScript puedes escribir 'hola'.toUpperCase() y funciona a la primera. Pero hay algo que no cuadra: un texto es un primitivo, los primitivos no son objetos… y los métodos son cosa de objetos. Entonces, ¿de dónde sale ese .toUpperCase()?

¿Qué son los tipos primitivos?#

En JavaScript, un primitivo (o primitive) es un dato que no es un objeto y no tiene métodos propios. Hay exactamente 7 tipos primitivos:

  • string: cadenas de texto.
  • number: números.
  • bigint: números enteros enormes.
  • boolean: verdadero o falso.
  • undefined: valor sin definir.
  • symbol: identificadores únicos.
  • null: ausencia intencionada de valor.
// Estos son todos tipos primitivoslet texto = 'Hola mundo'let numero = 42let grande = 123nlet verdadero = truelet indefinido = undefinedlet simbolo = Symbol('id')let nulo = null

La paradoja: ¿Cómo pueden los primitivos tener métodos?#

Si los primitivos no son objetos ni tienen métodos, esto no debería funcionar:

let texto = 'JavaScript'console.log(texto.length) // -> 10console.log(texto.toUpperCase()) // -> 'JAVASCRIPT'

Y sin embargo funciona: leemos una propiedad y llamamos a un método sobre un primitivo.

Object Wrappers: La magia detrás de escena#

El truco se llama Object Wrapper (objeto envoltorio). Piensa en un papel de regalo de usar y tirar: envuelve tu valor el tiempo justo y después va a la basura.

Cada vez que accedes a una propiedad o un método de un primitivo, JavaScript:

  1. Crea un objeto temporal que envuelve el valor primitivo.
  2. Ejecuta el método (o lee la propiedad) en ese objeto.
  3. Destruye el objeto nada más terminar y te devuelve el resultado.

Con nuestro ejemplo:

let texto = 'JavaScript'// Cuando escribes texto.toUpperCase(), JavaScript hace esto internamente:// 1. Crea: new String("JavaScript")// 2. Llama al método: new String("JavaScript").toUpperCase()// 3. Devuelve el resultado: "JAVASCRIPT"// 4. Destruye el objeto temporal
Infografía
La magia de los object wrappers
5.Por eso añadir una propiedad no sirve: se guarda en otro envoltorio que se descarta y luego devuelve undefined (en modo estricto, error).
Paso 5 de 5

Demostrando que los primitivos siguen siendo primitivos#

Vale, pero ¿y si texto se ha convertido en objeto por el camino? Tres pruebas de que no. Fíjate sobre todo en la segunda:

// 1. Usando typeoflet texto = 'Hola'console.log(typeof texto) // -> 'string' (no 'object')// 2. Intentando asignar propiedadestexto.nuevaPropiedad = 'valor'console.log(texto.nuevaPropiedad) // -> undefined (¡no se guardó!)// 3. Comparando con objetos realeslet textoObjeto = new String('Hola')console.log(typeof textoObjeto) // -> 'object'console.log(texto === textoObjeto) // -> false

La propiedad se la pusimos al envoltorio temporal, que desapareció al instante. Al pedirla después, JavaScript crea otro envoltorio distinto, sin rastro de ella.

Los Object Wrappers disponibles#

Cada primitivo tiene su envoltorio, con el mismo nombre pero empezando en mayúscula:

PrimitivoObject Wrapper
stringString
numberNumber
bigintBigInt
booleanBoolean
symbolSymbol

¿Echas de menos a dos? undefined y null no tienen envoltorio. Por eso llamar a un método sobre ellos lanza un error:

let indefinido = undefined// indefinido.toString() // ❌ TypeError: Cannot read properties of undefinedlet nulo = null// nulo.toString() // ❌ TypeError: Cannot read properties of null

¿Por qué es importante entender esto?#

Saber que existen los envoltorios te explica tres cosas:

  1. Rendimiento: conceptualmente, JavaScript crea y destruye un objeto temporal en cada acceso.
  2. Comportamiento: por eso no puedes guardar propiedades en un primitivo.
  3. Depuración: entiendes mejor los errores relacionados con tipos, como los de null y undefined.

Y pasa igual con cualquier primitivo. Mira un número:

// Esto funcionalet numero = 42console.log(numero.toString()) // -> '42'// Pero esto no guarda la propiedadnumero.nuevaPropiedad = 'valor'console.log(numero.nuevaPropiedad) // -> undefined// Porque cada acceso crea un nuevo objeto temporal

Para terminar...#

Los primitivos no son objetos, pero JavaScript te deja tratarlos como si lo fueran gracias a esos envoltorios temporales. En las próximas clases veremos uno a uno los tipos primitivos y sus métodos más útiles.

En resumen

  • Los primitivos no son objetos ni tienen métodos propios.
  • Al usar un método o una propiedad, JavaScript crea un Object Wrapper temporal, lo usa y lo destruye.
  • Por eso no puedes guardar propiedades en un primitivo: se quedan en un envoltorio que ya no existe.
  • null y undefined no tienen wrapper: llamar a un método sobre ellos lanza un TypeError.