Una de las características más interesantes de JavaScript es que nos permite trabajar con tipos de datos primitivos como si fueran objetos. Los primitivos también ofrecen métodos que podemos llamar. Los estudiaremos pronto, pero primero veamos cómo trabajan porque, por supuesto, los primitivos no son objetos.
En JavaScript, un primitive (valor primitivo, tipo de dato primitivo) son datos que no son un objeto y no tienen métodos. Hay 7 tipos de datos primitivos:
string - cadenas de textonumber - númerosbigint - números enteros grandesboolean - verdadero o falsoundefined - valor indefinidosymbol - símbolos como identificador úniconull - valor nuloNota
nulles un caso especial. Sutypeofesobjectpor un bug histórico. Además, es el valor del que deriva cualquierobject.
// Estos son todos tipos primitivos
let texto = 'Hola mundo'
let numero = 42
let grande = 123n
let verdadero = true
let indefinido = undefined
let simbolo = Symbol('id')
let nulo = null
Aquí viene lo interesante. Si los primitivos no son objetos y no tienen métodos, ¿cómo es posible que podamos hacer esto?
let texto = 'JavaScript'
console.log(texto.length) // 10
console.log(texto.toUpperCase()) // "JAVASCRIPT"
¡Estamos llamando propiedades y métodos en un tipo primitivo! ¿Cómo es esto posible?
Object Wrappers: La magia detrás de escenaLa respuesta está en los Object Wrappers (objetos envolventes). Cuando intentas acceder a un método o propiedad de un primitivo, JavaScript automáticamente:
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
Podemos demostrar que los primitivos no son objetos de varias formas:
// 1. Usando typeof
let texto = 'Hola'
console.log(typeof texto) // "string" (no "object")
// 2. Intentando asignar propiedades
texto.nuevaPropiedad = 'valor'
console.log(texto.nuevaPropiedad) // undefined (¡no se guardó!)
// 3. Comparando con objetos reales
let textoObjeto = new String('Hola')
console.log(typeof textoObjeto) // "object"
console.log(texto === textoObjeto) // false
NotaNUNCA crees una instancia de
String,Number,BigInt,BooleanoSymbol. Es innecesario y no es recomendable.
JavaScript proporciona object wrappers para los tipos primitivos:
String para stringNumber para numberBigInt para bigintBoolean para booleanSymbol para symbolNota: undefined y null no tienen object wrappers, por eso no puedes llamar métodos en ellos:
let indefinido = undefined
// indefinido.toString() // ❌ TypeError: Cannot read properties of undefined
let nulo = null
// nulo.toString() // ❌ TypeError: Cannot read properties of null
Entender cómo funcionan los métodos en primitivos es crucial porque:
// Esto funciona
let numero = 42
console.log(numero.toString()) // "42"
// Pero esto no guarda la propiedad
numero.nuevaPropiedad = 'valor'
console.log(numero.nuevaPropiedad) // undefined
// Porque cada acceso crea un nuevo objeto temporal
Los tipos primitivos en JavaScript no son objetos, pero JavaScript nos permite trabajar con ellos como si lo fueran mediante object wrappers temporales.
Esta característica hace que el lenguaje sea más fácil de usar, pero es importante entender que:
null y undefined no tienen object wrappersEn las próximas clases, exploraremos en detalle cada tipo primitivo y sus métodos más útiles.
Inicia sesión
Para guardar tu progreso y desbloquear logros