Para complementar un poco mas la clase, te comparto algunos ejemplos y aplicaciones de cada tipo de dato complejo

Cuando declaras una variable en JavaScript, le estás asignando un tipo de dato específico que define qué puede contener y cómo se comporta. Conocer los tipos de datos primitivos y complejos es la base para escribir código sólido, evitar errores silenciosos y entender por qué el lenguaje se comporta como lo hace en ciertos casos famosos, como el del null.
Esta guía es para ti si estás empezando con JavaScript y quieres dominar la diferencia entre un string, un number, un boolean y estructuras más robustas como objetos, arrays y funciones.
¿Cuáles son los 7 tipos de datos primitivos en JavaScript?
Los primitivos son representaciones de datos simples, valores únicos que puedes asignar directamente a una variable. JavaScript reconoce siete [01:00]:
"Hola".42.true o false.number.¿Cómo se declaran los primitivos en código?
La mejor práctica es empezar con const, salvo que necesites reasignar el valor más adelante; en ese caso usa let. Así se ve cada uno [02:30]:
javascript // Tipo de datos primitivos const texto = "Hola"; const numero = 42; const booleano = true; const nulo = null; const indefinido = undefined; const simbolo = Symbol("id"); const granNumero = 123n;
Fíjate en un detalle: si escribes "42" entre comillas, ya no es un número, es un string. Tu editor te ayuda con colores distintos para que reconozcas visualmente cada tipo.
¿Para qué sirve Symbol en JavaScript? Es un tipo de dato que crea identificadores únicos. Lo usarás cuando trabajes con aplicaciones más robustas y necesites asignar IDs irrepetibles a piezas de código.
¿Cómo verifico el tipo de dato de una variable?
Usas la palabra reservada typeof antes de la variable y lo imprimes con console.log [05:00]:
javascript console.log(typeof texto); // string console.log(typeof numero); // number console.log(typeof booleano); // boolean console.log(typeof nulo); // object ← ojo aquí console.log(typeof indefinido); // undefined console.log(typeof simbolo); // symbol console.log(typeof granNumero); // bigint
¿Por qué typeof null devuelve object en JavaScript?
Aquí viene lo interesante. Cuando ejecutas typeof null, JavaScript responde object, y eso confunde a cualquiera que esté empezando.
Es un error histórico del lenguaje. En las primeras implementaciones de JavaScript, null se representaba como un puntero nulo y quedó clasificado junto con los objetos. La comunidad lo reconoce como un bug, pero no se ha corregido por compatibilidad: arreglarlo rompería incontables aplicaciones construidas desde el nacimiento del lenguaje.
Conceptualmente, null no es un objeto. Es la ausencia intencional de un valor, distinta de undefined, que indica que una variable nunca recibió valor.
¿Cuál es la diferencia entre null y undefined?
nulllo asignas tú a propósito para indicar vacío.undefinedlo asigna JavaScript automáticamente cuando declaras una variable sin valor.
¿Qué son los tipos de datos complejos en JavaScript?
Los complejos agrupan múltiples valores o comportamientos en una sola estructura. Son tres [07:30]:
Así los declaras:
javascript // Tipos complejos const persona = { nombre: "Juan", edad: 30 }; const numeros = [1, 2, 3, "texto"]; const miFuncion = function() { // lógica aquí };
Un objeto puede mezclar strings y numbers dentro de sus propiedades. Un array también puede contener distintos tipos de datos en la misma lista. Y una función encapsula instrucciones que ejecutas cuando la llamas.
¿Qué cuidados debo tener con los nombres de variables?
Dos reglas que te van a ahorrar dolores de cabeza:
function a una constante, JavaScript te lanzará un error.miVariable y MiVariable son dos cosas distintas.Los comentarios también son tu aliado. Con // dejas notas que JavaScript ignora, pero que ayudan a cualquier compañero (o a ti mismo en seis meses) a entender qué hace el código.
¿Ya practicaste declarando tus propias variables con cada tipo? Cuéntame en los comentarios cuál fue el tipo de dato que más te costó identificar y cómo resolviste el reto.
Cuando declaras una variable en JavaScript, le estás asignando un tipo de dato específico que define qué puede contener y cómo se comporta. Conocer los tipos de datos primitivos y complejos es la base para escribir código sólido, evitar errores silenciosos y entender por qué el lenguaje se comporta como lo hace en ciertos casos famosos, como el del null.
Esta guía es para ti si estás empezando con JavaScript y quieres dominar la diferencia entre un string, un number, un boolean y estructuras más robustas como objetos, arrays y funciones.
Los primitivos son representaciones de datos simples, valores únicos que puedes asignar directamente a una variable. JavaScript reconoce siete [01:00]:
"Hola".42.true o false.number.La mejor práctica es empezar con const, salvo que necesites reasignar el valor más adelante; en ese caso usa let. Así se ve cada uno [02:30]:
javascript // Tipo de datos primitivos const texto = "Hola"; const numero = 42; const booleano = true; const nulo = null; const indefinido = undefined; const simbolo = Symbol("id"); const granNumero = 123n;
Fíjate en un detalle: si escribes "42" entre comillas, ya no es un número, es un string. Tu editor te ayuda con colores distintos para que reconozcas visualmente cada tipo.
¿Para qué sirve Symbol en JavaScript? Es un tipo de dato que crea identificadores únicos. Lo usarás cuando trabajes con aplicaciones más robustas y necesites asignar IDs irrepetibles a piezas de código.
Usas la palabra reservada typeof antes de la variable y lo imprimes con console.log [05:00]:
javascript console.log(typeof texto); // string console.log(typeof numero); // number console.log(typeof booleano); // boolean console.log(typeof nulo); // object ← ojo aquí console.log(typeof indefinido); // undefined console.log(typeof simbolo); // symbol console.log(typeof granNumero); // bigint
Aquí viene lo interesante. Cuando ejecutas typeof null, JavaScript responde object, y eso confunde a cualquiera que esté empezando.
Es un error histórico del lenguaje. En las primeras implementaciones de JavaScript, null se representaba como un puntero nulo y quedó clasificado junto con los objetos. La comunidad lo reconoce como un bug, pero no se ha corregido por compatibilidad: arreglarlo rompería incontables aplicaciones construidas desde el nacimiento del lenguaje.
Conceptualmente, null no es un objeto. Es la ausencia intencional de un valor, distinta de undefined, que indica que una variable nunca recibió valor.
¿Cuál es la diferencia entre null y undefined?
nulllo asignas tú a propósito para indicar vacío.undefinedlo asigna JavaScript automáticamente cuando declaras una variable sin valor.
Los complejos agrupan múltiples valores o comportamientos en una sola estructura. Son tres [07:30]:
Así los declaras:
javascript // Tipos complejos const persona = { nombre: "Juan", edad: 30 }; const numeros = [1, 2, 3, "texto"]; const miFuncion = function() { // lógica aquí };
Un objeto puede mezclar strings y numbers dentro de sus propiedades. Un array también puede contener distintos tipos de datos en la misma lista. Y una función encapsula instrucciones que ejecutas cuando la llamas.
Dos reglas que te van a ahorrar dolores de cabeza:
function a una constante, JavaScript te lanzará un error.miVariable y MiVariable son dos cosas distintas.Los comentarios también son tu aliado. Con // dejas notas que JavaScript ignora, pero que ayudan a cualquier compañero (o a ti mismo en seis meses) a entender qué hace el código.
¿Ya practicaste declarando tus propias variables con cada tipo? Cuéntame en los comentarios cuál fue el tipo de dato que más te costó identificar y cómo resolviste el reto.
Para complementar un poco mas la clase, te comparto algunos ejemplos y aplicaciones de cada tipo de dato complejo

Para complementar un poco mas la clase, te comparto algunos ejemplos y aplicaciones de cada uno de los datos primitivos.
El reto numero 9 se me complico un poquito porque yo queria utilizar un switch, pero no se podia evaluar el typeof en el case
// ============================================
// Reto: Tipos de datos en JavaScript
// ============================================
// Completa cada función según las instrucciones.
// Ejecuta los tests con: npx vitest src/02-tipos-de-datos
// ============================================
// --- Reto 1: Identificar tipos primitivos ---
// Declara las siguientes constantes con los valores indicados:
// texto = "hola"
// numero = 42
// booleano = true
// nulo = null
// indefinido = undefined
// simbolo = Symbol("id")
// grande = 123n
// Retorna un objeto con el typeof de cada una:
// { texto, numero, booleano, nulo, indefinido, simbolo, grande }
// donde cada valor es el resultado de typeof sobre la variable.
function identificarPrimitivos() {
// Tu código aquí
const texto = "hola";
const numero = 42;
const booleano = true;
const nulo = null;
const indefinido = undefined;
const simbolo = Symbol("id");
const grande = 123n;
return {
texto: typeof texto,
numero : typeof numero,
booleano: typeof booleano,
nulo: typeof nulo,
indefinido: typeof indefinido,
simbolo: typeof simbolo,
grande: typeof grande
};
}
// --- Reto 2: Diferenciar string y number ---
// Recibe un parámetro "valor".
// Retorna un objeto con:
// { tipo: typeof valor, esString: true/false, esNumber: true/false }
function diferenciarStringNumber(valor) {
// Tu código aquí
let tipoDato = typeof valor;
return {
tipo: tipoDato,
esString: tipoDato === 'string' ? true : false,
esNumber: tipoDato === 'number' ? true : false
};
}
// --- Reto 3: El caso especial de null ---
// Declara una constante "nulo" con valor null.
// Retorna un objeto con:
// { valor: nulo, tipo: typeof nulo, esNull: true/false }
// Pista: typeof null devuelve "object", pero debes verificar
// si realmente es null usando una comparación estricta (===).
function explorarNull() {
// Tu código aquí
const nulo = null;
return {
valor: nulo,
tipo: typeof nulo,
esNull: nulo === null ? true : false
};
}
// --- Reto 4: Undefined vs Null ---
// Declara una variable con let llamada "sinAsignar" (sin asignarle valor).
// Declara una constante "vacio" con valor null.
// Retorna un objeto con:
// { sinAsignar, vacio, tipoSinAsignar: typeof sinAsignar, tipoVacio: typeof vacio, sonIguales: sinAsignar == vacio, sonEstrictamenteIguales: sinAsignar === vacio }
function compararNullUndefined() {
// Tu código aquí
let sinAsignar;
const vacio = null;
return {
sinAsignar,
vacio,
tipoSinAsignar: typeof sinAsignar,
tipoVacio: typeof vacio,
sonIguales: sinAsignar == vacio,
sonEstrictamenteIguales: sinAsignar === vacio
};
}
// --- Reto 5: Symbol y BigInt ---
// Crea un Symbol con la descripción "miID".
// Crea un BigInt con el valor 9007199254740991n.
// Retorna un objeto con:
// { tipoSymbol: typeof del symbol, tipoBigInt: typeof del bigint, descripcionSymbol: symbol.description, valorBigInt: el bigint creado }
function crearSymbolYBigInt() {
// Tu código aquí
const simbolo = Symbol('miID');
const granNumero = 9007199254740991n;
return {
tipoSymbol: typeof simbolo,
tipoBigInt: typeof granNumero,
descripcionSymbol: simbolo.description,
valorBigInt: granNumero
}
}
// --- Reto 6: Crear un objeto ---
// Crea un objeto "persona" con las propiedades:
// nombre (string): "Juan"
// edad (number): 42
// activo (boolean): true
// Retorna un objeto con:
// { persona, tipoPersona: typeof persona, propiedades: Object.keys(persona) }
function crearObjeto() {
// Tu código aquí
const persona = {
nombre: "Juan",
edad: 42,
activo: true
};
return {
persona,
tipoPersona: typeof persona,
propiedades: Object.keys(persona)
};
}
// --- Reto 7: Trabajar con arrays ---
// Crea un arreglo "mezcla" con los valores: 1, "dos", true, null
// Retorna un objeto con:
// { arreglo: mezcla, esArreglo: Array.isArray(mezcla), largo: mezcla.length, tipos: [typeof de cada elemento] }
function trabajarConArreglos() {
// Tu código aquí
let mezcla = [1, "dos", true, null];
return {
arreglo: mezcla,
esArreglo: Array.isArray(mezcla),
largo: mezcla.length,
tipos: mezcla.map(valor => {return typeof valor})
};
}
// --- Reto 8: Funciones como valor ---
// Crea una constante "saludar" que sea una función que reciba un nombre
// y retorne "Hola, {nombre}!".
// Retorna un objeto con:
// { tipoFuncion: typeof saludar, resultado: saludar("JavaScript") }
function funcionComoValor() {
// Tu código aquí
const saludar = function (nombre) {
return `Hola, ${nombre}!`;
};
return {
tipoFuncion: typeof saludar,
resultado: saludar("JavaScript")
};
}
// --- Reto 9: Clasificar tipo de dato ---
// Recibe un parámetro "valor".
// Determina si es primitivo o complejo y retorna un objeto con:
// { valor, tipo: typeof valor, clasificacion: "primitivo" | "complejo" }
// Reglas:
// - Si es null, clasificación es "primitivo" (a pesar de typeof).
// - Si typeof es "object" o "function", clasificación es "complejo".
// - En cualquier otro caso, clasificación es "primitivo".
// Pista: primero verifica si es null, luego revisa typeof.
function clasificarTipo(valor) {
// Tu código aquí
let esPrimitivo;
const tipoDato = typeof valor;
if(valor === null) {
esPrimitivo = true;
} else if(tipoDato === "object" || tipoDato === "function") {
esPrimitivo = false;
} else {
esPrimitivo = true;
}
return {
valor,
tipo: typeof valor,
clasificacion: esPrimitivo ? "primitivo" : "complejo"
}
}
module.exports = {
identificarPrimitivos,
diferenciarStringNumber,
explorarNull,
compararNullUndefined,
crearSymbolYBigInt,
crearObjeto,
trabajarConArreglos,
funcionComoValor,
clasificarTipo,
};
Mi solución al reto:
// ============================================
// Reto: Tipos de datos en JavaScript
// ============================================
// Completa cada función según las instrucciones.
// Ejecuta los tests con: npx vitest src/02-tipos-de-datos
// ============================================
// --- Reto 1: Identificar tipos primitivos ---
// Declara las siguientes constantes con los valores indicados:
// texto = "hola"
// numero = 42
// booleano = true
// nulo = null
// indefinido = undefined
// simbolo = Symbol("id")
// grande = 123n
// Retorna un objeto con el typeof de cada una:
// { texto, numero, booleano, nulo, indefinido, simbolo, grande }
// donde cada valor es el resultado de typeof sobre la variable.
function identificarPrimitivos() {
// Tu código aquí
const texto = "hola";
const numero = 42;
const booleano = true;
const nulo = null;
const indefinido = undefined;
const simbolo = Symbol("id");
const grande = 123n;
return {
tipotexto: typeof texto,
tiponumero: typeof numero,
tipobooleano: typeof booleano,
tiponulo: typeof nulo,
tipoindefinido: typeof indefinido,
tiposimbolo: typeof simbolo,
tipogrande: typeof grande
}
}
//console.log(identificarPrimitivos());
// --- Reto 2: Diferenciar string y number ---
// Recibe un parámetro "valor".
// Retorna un objeto con:
// { tipo: typeof valor, esString: true/false, esNumber: true/false }
function diferenciarStringNumber(valor) {
// Tu código aquí
valor = 10;
return {
tipo: typeof valor,
esString: typeof valor == String,
esNumber: typeof valor == Number
}
}
console.log(diferenciarStringNumber());
// --- Reto 3: El caso especial de null ---
// Declara una constante "nulo" con valor null.
// Retorna un objeto con:
// { valor: nulo, tipo: typeof nulo, esNull: true/false }
// Pista: typeof null devuelve "object", pero debes verificar
// si realmente es null usando una comparación estricta (===).
function explorarNull() {
// Tu código aquí
const nulo = null;
return {
valor: nulo,
tipo: typeof nulo,
esNull: typeof nulo == null
}
}
console.log(explorarNull());
// --- Reto 4: Undefined vs Null ---
// Declara una variable con let llamada "sinAsignar" (sin asignarle valor).
// Declara una constante "vacio" con valor null.
// Retorna un objeto con:
// { sinAsignar, vacio, tipoSinAsignar: typeof sinAsignar, tipoVacio: typeof vacio, sonIguales: sinAsignar == vacio, sonEstrictamenteIguales: sinAsignar === vacio }
function compararNullUndefined() {
// Tu código aquí
let sinAsignar;
const vacio = null;
return {
sinAsignar,
vacio,
tiposinAsignar: typeof sinAsignar,
tipovacio: typeof vacio,
sonIguales: sinAsignar == vacio,
sonEstrictamenteIguales: sinAsignar === vacio,
}
}
console.log(compararNullUndefined());
// --- Reto 5: Symbol y BigInt ---
// Crea un Symbol con la descripción "miID".
// Crea un BigInt con el valor 9007199254740991n.
// Retorna un objeto con:
// { tipoSymbol: typeof del symbol, tipoBigInt: typeof del bigint, descripcionSymbol: symbol.description, valorBigInt: el bigint creado }
function crearSymbolYBigInt() {
// Tu código aquí
const simbolo1 = Symbol("miID");
const BigInt = 9007199254740991n;
return {
tipoSymbol: typeof simbolo1,
tipoBigInt: typeof BigInt,
descripcionSymbol: simbolo1.description,
valorBigInt: BigInt
}
}
console.log(crearSymbolYBigInt());
// --- Reto 6: Crear un objeto ---
// Crea un objeto "persona" con las propiedades:
// nombre (string): "Juan"
// edad (number): 42
// activo (boolean): true
// Retorna un objeto con:
// { persona, tipoPersona: typeof persona, propiedades: Object.keys(persona) }
function crearObjeto() {
// Tu código aquí
const persona = { nombre: "Juan", edad: 42, activo: true };
return {
persona,
tipoPersona: typeof persona,
propiedades: Object.keys(persona)
}
}
console.log(crearObjeto());
// --- Reto 7: Trabajar con arrays ---
// Crea un arreglo "mezcla" con los valores: 1, "dos", true, null
// Retorna un objeto con:
// { arreglo: mezcla, esArreglo: Array.isArray(mezcla), largo: mezcla.length, tipos: [typeof de cada elemento] }
function trabajarConArreglos() {
// Tu código aquí
const mezcla = [1, "dos", true, null];
return {
arreglo: mezcla,
esArreglo: Array.isArray(mezcla),
largo: mezcla.length,
tipos: [typeof mezcla[1], typeof mezcla[2], typeof mezcla[3]]
}
}
console.log(trabajarConArreglos());
// --- Reto 8: Funciones como valor ---
// Crea una constante "saludar" que sea una función que reciba un nombre
// y retorne "Hola, {nombre}!".
// Retorna un objeto con:
// { tipoFuncion: typeof saludar, resultado: saludar("JavaScript") }
function funcionComoValor() {
// Tu código aquí
const saludar = function (nombre) {
return `Hola, ${nombre}!`;}
return {
tipoFuncion: typeof saludar,
resultado: saludar("JavaScript"),
}
}
console.log(funcionComoValor());
// --- Reto 9: Clasificar tipo de dato ---
// Recibe un parámetro "valor".
// Determina si es primitivo o complejo y retorna un objeto con:
// { valor, tipo: typeof valor, clasificacion: "primitivo" | "complejo" }
// Reglas:
// - Si es null, clasificación es "primitivo" (a pesar de typeof).
// - Si typeof es "object" o "function", clasificación es "complejo".
// - En cualquier otro caso, clasificación es "primitivo".
// Pista: primero verifica si es null, luego revisa typeof.
function clasificarTipo(valor) {
// Tu código aquí
let clasificacion;
if (valor == null) {
clasificacion = "Primitivo"
}
else if (typeof valor == "object" || typeof valor == "function") {
clasificacion = "Complejo"
}
else {
clasificacion = "Primitivo"
};
return {
valor,
tipo: typeof valor,
clasificacion: clasificacion,
}
}
console.log(clasificarTipo(null));
module.exports = {
identificarPrimitivos,
diferenciarStringNumber,
explorarNull,
compararNullUndefined,
crearSymbolYBigInt,
crearObjeto,
trabajarConArreglos,
funcionComoValor,
clasificarTipo,
};
Este curso es demasiado bueno

// ============================================
// Reto: Tipos de datos en JavaScript
// ============================================
// Completa cada función según las instrucciones.
// Ejecuta los tests con: npx vitest src/02-tipos-de-datos
// ============================================
// --- Reto 1: Identificar tipos primitivos ---
// Declara las siguientes constantes con los valores indicados:
// texto = "hola"
// numero = 42
// booleano = true
// nulo = null
// indefinido = undefined
// simbolo = Symbol("id")
// grande = 123n
// Retorna un objeto con el typeof de cada una:
// { texto, numero, booleano, nulo, indefinido, simbolo, grande }
// donde cada valor es el resultado de typeof sobre la variable.
function identificarPrimitivos() {
const texto = "hola"
const numero = 42
const booleano = true
const nulo = null
const indefinido = undefined
const simbolo = Symbol("id")
const grande = 123n
return {
texto: typeof texto,
numero: typeof numero,
booleano: typeof booleano,
nulo: typeof nulo,
indefinido: typeof indefinido,
simbolo: typeof simbolo,
grande: typeof grande
}
}
// --- Reto 2: Diferenciar string y number ---
// Recibe un parámetro "valor".
// Retorna un objeto con:
// { tipo: typeof valor, esString: true/false, esNumber: true/false }
function diferenciarStringNumber(valor) {
return {
tipo: typeof valor,
esString: typeof valor === 'string',
esNumber: typeof valor === 'number'
}
}
// --- Reto 3: El caso especial de null ---
// Declara una constante "nulo" con valor null.
// Retorna un objeto con:
// { valor: nulo, tipo: typeof nulo, esNull: true/false }
// Pista: typeof null devuelve "object", pero debes verificar
// si realmente es null usando una comparación estricta (===).
function explorarNull() {
const nulo = null;
return {
valor: nulo,
tipo: typeof nulo,
esNull: nulo === null,
};
}
// --- Reto 4: Undefined vs Null ---
// Declara una variable con let llamada "sinAsignar" (sin asignarle valor).
// Declara una constante "vacio" con valor null.
// Retorna un objeto con:
// { sinAsignar, vacio, tipoSinAsignar: typeof sinAsignar, tipoVacio: typeof vacio, sonIguales: sinAsignar == vacio, sonEstrictamenteIguales: sinAsignar === vacio }
function compararNullUndefined() {
let sinAsignar;
const vacio = null;
return{
sinAsignar,
vacio,
tipoSinAsignar: typeof sinAsignar,
tipoVacio: typeof vacio,
sonIguales: sinAsignar == vacio,
sonEstrictamenteIguales: sinAsignar === vacio
}
}
// --- Reto 5: Symbol y BigInt ---
// Crea un Symbol con la descripción "miID".
// Crea un BigInt con el valor 9007199254740991n.
// Retorna un objeto con:
// { tipoSymbol: typeof del symbol, tipoBigInt: typeof del bigint, descripcionSymbol: symbol.description, valorBigInt: el bigint creado }
function crearSymbolYBigInt() {
const symbol = Symbol('miID');
const bigint = 9007199254740991n;
return{
tipoSymbol: typeof symbol,
tipoBigInt: typeof bigint,
descripcionSymbol: symbol.description,
valorBigInt: bigint
}
}
// --- Reto 6: Crear un objeto ---
// Crea un objeto "persona" con las propiedades:
// nombre (string): "Juan"
// edad (number): 42
// activo (boolean): true
// Retorna un objeto con:
// { persona, tipoPersona: typeof persona, propiedades: Object.keys(persona) }
function crearObjeto() {
const persona = {
nombre: 'Juan',
edad: 42,
activo: true
}
return{
persona,
tipoPersona: typeof persona,
propiedades: Object.keys(persona)
}
}
// --- Reto 7: Trabajar con arrays ---
// Crea un arreglo "mezcla" con los valores: 1, "dos", true, null
// Retorna un objeto con:
// { arreglo: mezcla, esArreglo: Array.isArray(mezcla), largo: mezcla.length, tipos: [typeof de cada elemento] }
function trabajarConArreglos() {
const mezcla = [1,'dos',true,null];
return{
arreglo: mezcla,
esArreglo: Array.isArray(mezcla),
largo: mezcla.length,
tipos: mezcla.map((el) => typeof el)
}
}
// --- Reto 8: Funciones como valor ---
// Crea una constante "saludar" que sea una función que reciba un nombre
// y retorne "Hola, {nombre}!".
// Retorna un objeto con:
// { tipoFuncion: typeof saludar, resultado: saludar("JavaScript") }
function funcionComoValor() {
const saludar = function(nombre) {return`Hola, ${nombre}`};
return{
tipoFuncion: typeof saludar,
resultado: saludar("JavaScript!")
}
}
// --- Reto 9: Clasificar tipo de dato ---
// Recibe un parámetro "valor".
// Determina si es primitivo o complejo y retorna un objeto con:
// { valor, tipo: typeof valor, clasificacion: "primitivo" | "complejo" }
// Reglas:
// - Si es null, clasificación es "primitivo" (a pesar de typeof).
// - Si typeof es "object" o "function", clasificación es "complejo".
// - En cualquier otro caso, clasificación es "primitivo".
// Pista: primero verifica si es null, luego revisa typeof.
function clasificarTipo(valor) {
if (valor === null) {
return { valor, tipo: typeof valor, clasificacion: "primitivo" };
}
const tipo = typeof valor;
if (tipo === "object" || tipo === "function") {
return { valor, tipo, clasificacion: "complejo" };
}
return { valor, tipo, clasificacion: "primitivo" };
}
export {
identificarPrimitivos,
diferenciarStringNumber,
explorarNull,
compararNullUndefined,
crearSymbolYBigInt,
crearObjeto,
trabajarConArreglos,
funcionComoValor,
clasificarTipo,
};
// ============================================
// Reto: Tipos de datos en JavaScript
// ============================================
// Completa cada función según las instrucciones.
// Ejecuta los tests con: npx vitest src/02-tipos-de-datos
// ============================================
// --- Reto 1: Identificar tipos primitivos ---
// Declara las siguientes constantes con los valores indicados:
// texto = "hola"
// numero = 42
// booleano = true
// nulo = null
// indefinido = undefined
// simbolo = Symbol("id")
// grande = 123n
// Retorna un objeto con el typeof de cada una:
// { texto, numero, booleano, nulo, indefinido, simbolo, grande }
// donde cada valor es el resultado de typeof sobre la variable.
function identificarPrimitivos() {
const texto = 'Hola';
const numero = 42;
const booleano = true; // false
const nulo = null;
const indefinido = undefined;
const simbolo = Symbol("id");
const grande = 123n;
return{
texto: typeof texto,
numero: typeof numero,
booleano: typeof booleano,
nulo: typeof nulo,
indefinido: typeof indefinido,
simbolo: typeof simbolo,
grande: typeof grande,
};
}
console.log(identificarPrimitivos());
// --- Reto 2: Diferenciar string y number ---
// Recibe un parámetro "valor".
// Retorna un objeto con:
// { tipo: typeof valor, esString: true/false, esNumber: true/false }
function diferenciarStringNumber(valor) {
return {
tipo: typeof valor,
esString: typeof valor === 'string',
esNumber: typeof valor === 'number'
};
}
console.log(diferenciarStringNumber("Hola"));
// --- Reto 3: El caso especial de null ---
// Declara una constante "nulo" con valor null.
// Retorna un objeto con:
// { valor: nulo, tipo: typeof nulo, esNull: true/false }
// Pista: typeof null devuelve "object", pero debes verificar
// si realmente es null usando una comparación estricta (===).
function explorarNull() {
const nulo = null;
return {
valor: nulo,
tipo: typeof nulo,
esNull:nulo === null
};
}
console.log(explorarNull());
// --- Reto 4: Undefined vs Null ---
// Declara una variable con let llamada "sinAsignar" (sin asignarle valor).
// Declara una constante "vacio" con valor null.
// Retorna un objeto con:
// { sinAsignar, vacio, tipoSinAsignar: typeof sinAsignar, tipoVacio: typeof vacio, sonIguales: sinAsignar == vacio, sonEstrictamenteIguales: sinAsignar === vacio }
function compararNullUndefined() {
let sinAsignar;
const vacio = null;
return {
sinAsignar,
vacio,
tipoSinAsignar: typeof sinAsignar,
tipoVacio: typeof vacio,
sonIguales: sinAsignar == vacio,
sonEstrictamenteIguales: sinAsignar === vacio
};
}
console.log(compararNullUndefined());
// --- Reto 5: Symbol y BigInt ---
// Crea un Symbol con la descripción "miID".
// Crea un BigInt con el valor 9007199254740991n.
// Retorna un objeto con:
// { tipoSymbol: typeof del symbol, tipoBigInt: typeof del bigint, descripcionSymbol: symbol.description, valorBigInt: el bigint creado }
function crearSymbolYBigInt() {
const miSymbol = Symbol("miID")
const miBigInt = 9007199254740991n
return {
tipoSymbol: typeof miSymbol,
tipoBigInt: typeof miBigInt,
descripcionSymbol: miSymbol.description,
valorBigInt: miBigInt
};
}
console.log(crearSymbolYBigInt());
// --- Reto 6: Crear un objeto ---
// Crea un objeto "persona" con las propiedades:
// nombre (string): "Juan"
// edad (number): 42
// activo (boolean): true
// Retorna un objeto con:
// { persona, tipoPersona: typeof persona, propiedades: Object.keys(persona) }
function crearObjeto() {
const persona = {
nombre: "Juan",
edad: 42,
activo: true
};
return {
persona,
tipoPersona: typeof persona,
propiedades: Object.keys(persona)
};
}
console.log(crearObjeto());
// --- Reto 7: Trabajar con arrays ---
// Crea un arreglo "mezcla" con los valores: 1, "dos", true, null
// Retorna un objeto con:
// { arreglo: mezcla, esArreglo: Array.isArray(mezcla), largo: mezcla.length, tipos: [typeof de cada elemento] }
function trabajarConArreglos() {
const mezcla = [1, "dos", true, null];
return{
arreglo: mezcla,
esArreglo: Array.isArray(mezcla),
largo: mezcla.length,
tipos: [typeof mezcla[0], typeof mezcla[1], typeof mezcla[2], typeof mezcla[3]]
}
}
console.log(trabajarConArreglos());
// --- Reto 8: Funciones como valor ---
// Crea una constante "saludar" que sea una función que reciba un nombre
// y retorne "Hola, {nombre}!".
// Retorna un objeto con:
// { tipoFuncion: typeof saludar, resultado: saludar("JavaScript") }
function funcionComoValor() {
const saludar = (nombre) => `Hola, ${nombre}!`;
return {
tipoFuncion: typeof saludar,
resultado: saludar("JavaScript")
}
}
console.log(funcionComoValor());
// --- Reto 9: Clasificar tipo de dato ---
// Recibe un parámetro "valor".
// Determina si es primitivo o complejo y retorna un objeto con:
// { valor, tipo: typeof valor, clasificacion: "primitivo" | "complejo" }
// Reglas:
// - Si es null, clasificación es "primitivo" (a pesar de typeof).
// - Si typeof es "object" o "function", clasificación es "complejo".
// - En cualquier otro caso, clasificación es "primitivo".
// Pista: primero verifica si es null, luego revisa typeof.
function clasificarTipo(valor) {
let tipoValor;
if (valor === null) {
tipoValor = "primitivo";
}
else if (typeof valor === "object" || typeof valor === "function") {
tipoValor = "complejo";
}
else {
tipoValor = "primitivo";
}
return {
valor,
tipo: typeof valor,
clasificacion: tipoValor
};
}
console .log(clasificarTipo(null));
module.exports = {
identificarPrimitivos,
diferenciarStringNumber,
explorarNull,
compararNullUndefined,
crearSymbolYBigInt,
crearObjeto,
trabajarConArreglos,
funcionComoValor,
clasificarTipo,
};

Listo!
function identificarPrimitivos() {
const texto = "hola";
const numero = 42;
const booleano = true;
const nulo = null;
const indefinido = undefined;
const simbolo = Symbol("id");
const grande = 123n;
return {
texto: typeof texto,
numero: typeof numero,
booleano: typeof booleano,
nulo: typeof nulo,
indefinido: typeof indefinido,
simbolo: typeof simbolo,
grande: typeof grande,
};
}
console.log(identificarPrimitivos());
// --- Reto 2: Diferenciar string y number ---
// Recibe un parámetro "valor".
// Retorna un objeto con:
// { tipo: typeof valor, esString: true/false, esNumber: true/false }
function diferenciarStringNumber(valor) {
return {
tipo: typeof valor,
esString: typeof valor === "string",
esNumber: typeof valor === "number",
};
}
console.log(diferenciarStringNumber(5));
// --- Reto 3: El caso especial de null ---
// Declara una constante "nulo" con valor null.
// Retorna un objeto con:
// { valor: nulo, tipo: typeof nulo, esNull: true/false }
// Pista: typeof null devuelve "object", pero debes verificar
// si realmente es null usando una comparación estricta (===).
function explorarNull() {
const nulo = null;
return {
valor: nulo,
tipo: typeof nulo,
esNull: nulo === null,
};
}
console.log(explorarNull());
// --- Reto 4: Undefined vs Null ---
// Declara una variable con let llamada "sinAsignar" (sin asignarle valor).
// Declara una constante "vacio" con valor null.
// Retorna un objeto con:
// { sinAsignar, vacio, tipoSinAsignar: typeof sinAsignar, tipoVacio: typeof vacio, sonIguales: sinAsignar == vacio, sonEstrictamenteIguales: sinAsignar === vacio }
function compararNullUndefined() {
let sinAsignar;
const vacio = null;
return {
sinAsignar,
vacio,
tipoSinAsignar: typeof sinAsignar,
tipoVacio: typeof vacio,
sonIguales: sinAsignar == vacio,
sonEstrictamenteIguales: sinAsignar === vacio
};
}
console.log(compararNullUndefined());
// --- Reto 5: Symbol y BigInt ---
// Crea un Symbol con la descripción "miID".
// Crea un BigInt con el valor 9007199254740991n.
// Retorna un objeto con:
// { tipoSymbol: typeof del symbol, tipoBigInt: typeof del bigint, descripcionSymbol: symbol.description, valorBigInt: el bigint creado }
function crearSymbolYBigInt() {
const simbolo = Symbol("miID");
const numeroGrande = 9007199254740991n;
return {
tipoSymbol: typeof simbolo,
tipoBigInt: typeof numeroGrande,
descripcionSymbol: simbolo.description,
valorBigInt: numeroGrande,
};
}
console.log(crearSymbolYBigInt());
// --- Reto 6: Crear un objeto ---
// Crea un objeto "persona" con las propiedades:
// nombre (string): "Juan"
// edad (number): 42
// activo (boolean): true
// Retorna un objeto con:
// { persona, tipoPersona: typeof persona, propiedades: Object.keys(persona) }
function crearObjeto() {
const persona = {
nombre: "Juan",
edad: 42,
activo: true,
};
return {
persona,
tipoPersona: typeof persona,
propiedades: Object.keys(persona)
};
}
console.log(crearObjeto());
// --- Reto 7: Trabajar con arrays ---
// Crea un arreglo "mezcla" con los valores: 1, "dos", true, null
// Retorna un objeto con:
// { arreglo: mezcla, esArreglo: Array.isArray(mezcla), largo: mezcla.length, tipos: [typeof de cada elemento] }
function trabajarConArreglos() {
const mezcla = [1, "dos", true, null];
return {
arreglo: mezcla,
esArreglo: Array.isArray(mezcla),
largo: mezcla.length,
tipos: [typeof mezcla[0], typeof mezcla[1], typeof mezcla[2], typeof mezcla[3], ]
};
}
console.log(trabajarConArreglos());
// --- Reto 8: Funciones como valor ---
// Crea una constante "saludar" que sea una función que reciba un nombre
// y retorne "Hola, {nombre}!".
// Retorna un objeto con:
// { tipoFuncion: typeof saludar, resultado: saludar("JavaScript") }
function funcionComoValor() {
const saludar = function (nombre) {
return "Hola," + " " + nombre + "!";
}
return {
tipoFuncion: typeof saludar,
resultado: saludar("JavaScript"),
};
}
console.log(funcionComoValor());
// --- Reto 9: Clasificar tipo de dato ---
// Recibe un parámetro "valor".
// Determina si es primitivo o complejo y retorna un objeto con:
// { valor, tipo: typeof valor, clasificacion: "primitivo" | "complejo" }
// Reglas:
// - Si es null, clasificación es "primitivo" (a pesar de typeof).
// - Si typeof es "object" o "function", clasificación es "complejo".
// - En cualquier otro caso, clasificación es "primitivo".
// Pista: primero verifica si es null, luego revisa typeof.
function clasificarTipo(valor) {
let tipoValor;
if (valor === null) {
tipoValor = "primitivo";
}
else if (typeof valor === "object" || typeof valor === "function") {
tipoValor = "complejo";
} else {
tipoValor = "primitivo";
}
return {
valor,
tipo: typeof valor,
clasificacion: tipoValor,
};
}
console.log(clasificarTipo(8));

// --- Reto 1: Identificar tipos primitivos ---
// Declara las siguientes constantes con los valores indicados:
// texto = "hola"
// numero = 42
// booleano = true
// nulo = null
// indefinido = undefined
// simbolo = Symbol("id")
// grande = 123n
// Retorna un objeto con el typeof de cada una:
// { texto, numero, booleano, nulo, indefinido, simbolo, grande }
// donde cada valor es el resultado de typeof sobre la variable.
function identificarPrimitivos() {
// Tu código aquí
const texto = 'hola';
const numero = 45;
const boolean = true; // false
const nulo = null;
const indefinido = undefined;
const simbolo = symbol('id'); //
const grande = 123n; // biginit valores numericos grandes
return{
texto : (typeof texto),
numero : (typeof numero),
boolean : (typeof boolean),
nulo : (typeof nulo),
simbolo : (typeof simbolo)
};
}
console.log(identificarPrimitivos());
// --- Reto 2: Diferenciar string y number ---
// Recibe un parámetro "valor".
// Retorna un objeto con:
// { tipo: typeof valor, esString: true/false, esNumber: true/false }
function diferenciarStringNumber(valor) {
// Tu código aquí
return{
tipo : (typeof valor),
esString : typeof valor == "string",
esNumber : typeof valor == "number"
}
}
console.log(diferenciarStringNumber(20));
// --- Reto 3: El caso especial de null ---
// Declara una constante "nulo" con valor null.
// Retorna un objeto con:
// { valor: nulo, tipo: typeof nulo, esNull: true/false }
// Pista: typeof null devuelve "object", pero debes verificar
// si realmente es null usando una comparación estricta (===).
function explorarNull() {
// Tu código aquí
let nulo = null;
return{
valor : nulo,
tipo: typeof nulo,
esNull : typeof nulo === null
}
}
console.log(explorarNull());
// --- Reto 4: Undefined vs Null ---
// Declara una variable con let llamada "sinAsignar" (sin asignarle valor).
// Declara una constante "vacio" con valor null.
// Retorna un objeto con:
// { sinAsignar, vacio, tipoSinAsignar: typeof sinAsignar, tipoVacio: typeof vacio, sonIguales: sinAsignar == vacio,
// sonEstrictamenteIguales: sinAsignar === vacio }
function compararNullUndefined() {
// Tu código aquí
let sinAsignar
const vacio = null;
return{
sinAsignar,
vacio,
tipoSinAsignar : typeof sinAsignar,
tipoVacio : typeof vacio,
sonIguales: sinAsignar == vacio,
sonEstrictamenteIguales : sinAsignar === vacio
}
}
console.log(compararNullUndefined());
// --- Reto 5: Symbol y BigInt ---
// Crea un Symbol con la descripción "miID".
// Crea un BigInt con el valor 9007199254740991n.
// Retorna un objeto con:
// { tipoSymbol: typeof del symbol, tipoBigInt: typeof del bigint, descripcionSymbol: symbol.description, valorBigInt:
// el bigint creado }
function crearSymbolYBigInt() {
// Tu código aquí
let symbol = Symbol('miID');
let bigint = 9007199254740991n;
return{
tipoSymbol : typeof symbol,
tipoBigint : typeof bigint,
descripcionSymbol : symbol.description,
valorBigInt : bigint
}
}
console.log(crearSymbolYBigInt());
// --- Reto 6: Crear un objeto ---
// Crea un objeto "persona" con las propiedades:
// nombre (string): "Juan"
// edad (number): 42
// activo (boolean): true
// Retorna un objeto con:
// { persona, tipoPersona: typeof persona, propiedades: Object.keys(persona) }
function crearObjeto() {
// Tu código aquí
const persona =
{
nombre: 'juan',
edad : 42,
activo : true
}
return{
persona: persona,
tipoPersona : typeof persona,
propiedades : Object.keys(persona)
}
}
console.log(crearObjeto());
// --- Reto 7: Trabajar con arrays ---
// Crea un arreglo "mezcla" con los valores: 1, "dos", true, null
// Retorna un objeto con:
// { arreglo: mezcla, esArreglo: Array.isArray(mezcla), largo: mezcla.length, tipos: [typeof de cada elemento] }
function trabajarConArreglos() {
// Tu código aquí
let mezcla = [1, 'dos',true, null]
mezcla.forEach((dato) => {
console.log(typeof dato)
});
return{
arreglo: mezcla,
esArreglo: Array.isArray(mezcla),
largo : mezcla.length,
tipos : [typeof mezcla[0], typeof mezcla[1], typeof mezcla[2]]
}
}
console.log(trabajarConArreglos());
// --- Reto 8: Funciones como valor ---
// Crea una constante "saludar" que sea una función que reciba un nombre
// y retorne "Hola, {nombre}!".
// Retorna un objeto con:
// { tipoFuncion: typeof saludar, resultado: saludar("JavaScript") }
function funcionComoValor() {
// Tu código aquí
const saludar = (nombre) => `Hola, ${nombre}!`;
return {
tipoFuncion: typeof saludar,
resultado: saludar("JavaScript")
};
}
console.log(funcionComoValor());
// --- Reto 9: Clasificar tipo de dato ---
// Recibe un parámetro "valor".
// Determina si es primitivo o complejo y retorna un objeto con:
// { valor, tipo: typeof valor, clasificacion: "primitivo" | "complejo" }
// Reglas:
// - Si es null, clasificación es "primitivo" (a pesar de typeof).
// - Si typeof es "object" o "function", clasificación es "complejo".
// - En cualquier otro caso, clasificación es "primitivo".
// Pista: primero verifica si es null, luego revisa typeof.
function clasificarTipo(valor) {
// Tu código aquí
// let tipo = typeof valor;
let clasificacion;
if (valor == null){
clasificacion = 'primitivo';
}else if(typeof valor == "object" || typeof valor =="function"){
clasificacion ='complejo'
}else{
clasificacion ='complejo'
}
return{
valor: typeof valor,
clasificacion : clasificacion
}
}
console.log(clasificarTipo());
module.exports = {
identificarPrimitivos,
diferenciarStringNumber,
explorarNull,
compararNullUndefined,
crearSymbolYBigInt,
crearObjeto,
trabajarConArreglos,
funcionComoValor,
clasificarTipo,
};
Mi solución al reto:
// ============================================
// Reto: Tipos de datos en JavaScript
// ============================================
// Completa cada función según las instrucciones.
// Ejecuta los tests con: npx vitest src/02-tipos-de-datos
// ============================================
// --- Reto 1: Identificar tipos primitivos ---
// Declara las siguientes constantes con los valores indicados:
// texto = "hola"
// numero = 42
// booleano = true
// nulo = null
// indefinido = undefined
// simbolo = Symbol("id")
// grande = 123n
// Retorna un objeto con el typeof de cada una:
// { texto, numero, booleano, nulo, indefinido, simbolo, grande }
// donde cada valor es el resultado de typeof sobre la variable.
function identificarPrimitivos() {
const texto = "hola";
const numero = 42;
const booleano = true;
const nulo = null;
const indefinido = undefined;
const simbolo = Symbol("id");
const grande = 123n;
return {
texto: typeof texto,
numero: typeof numero,
booleano: typeof booleano,
nulo: typeof nulo,
indefinido: typeof indefinido,
simbolo: typeof simbolo,
grande: typeof grande,
};
}
// --- Reto 2: Diferenciar string y number ---
// Recibe un parámetro "valor".
// Retorna un objeto con:
// { tipo: typeof valor, esString: true/false, esNumber: true/false }
function diferenciarStringNumber(valor) {
return {
tipo: typeof valor,
esString: typeof valor === "string",
esNumber: typeof valor === "number",
};
}
// --- Reto 3: El caso especial de null ---
// Declara una constante "nulo" con valor null.
// Retorna un objeto con:
// { valor: nulo, tipo: typeof nulo, esNull: true/false }
// Pista: typeof null devuelve "object", pero debes verificar
// si realmente es null usando una comparación estricta (===).
function explorarNull() {
const valor = null;
return { valor: valor, tipo: typeof valor, esNull: valor === null };
}
// --- Reto 4: Undefined vs Null ---
// Declara una variable con let llamada "sinAsignar" (sin asignarle valor).
// Declara una constante "vacio" con valor null.
// Retorna un objeto con:
// { sinAsignar, vacio, tipoSinAsignar: typeof sinAsignar, tipoVacio: typeof vacio, sonIguales: sinAsignar == vacio, sonEstrictamenteIguales: sinAsignar === vacio }
function compararNullUndefined() {
let sinAsignar;
const vacio = null;
return {
sinAsignar: sinAsignar,
vacio: vacio,
tipoSinAsignar: typeof sinAsignar,
tipoVacio: typeof vacio,
sonIguales: sinAsignar == vacio,
sonEstrictamenteIguales: sinAsignar === vacio,
};
}
// --- Reto 5: Symbol y BigInt ---
// Crea un Symbol con la descripción "miID".
// Crea un BigInt con el valor 9007199254740991n.
// Retorna un objeto con:
// { tipoSymbol: typeof del symbol, tipoBigInt: typeof del bigint, descripcionSymbol: symbol.description, valorBigInt: el bigint creado }
function crearSymbolYBigInt() {
const miSymbol = Symbol("miID");
const miBigInt = 9007199254740991n;
return {
tipoSymbol: typeof miSymbol,
tipoBigInt: typeof miBigInt,
descripcionSymbol: miSymbol.description,
valorBigInt: miBigInt,
};
}
// --- Reto 6: Crear un objeto ---
// Crea un objeto "persona" con las propiedades:
// nombre (string): "Juan"
// edad (number): 42
// activo (boolean): true
// Retorna un objeto con:
// { persona, tipoPersona: typeof persona, propiedades: Object.keys(persona) }
function crearObjeto() {
const persona = {
nombre: "Juan",
edad: 42,
activo: true,
};
return {
persona: persona,
tipoPersona: typeof persona,
propiedades: Object.keys(persona),
};
}
// --- Reto 7: Trabajar con arrays ---
// Crea un arreglo "mezcla" con los valores: 1, "dos", true, null
// Retorna un objeto con:
// { arreglo: mezcla, esArreglo: Array.isArray(mezcla), largo: mezcla.length, tipos: [typeof de cada elemento] }
function trabajarConArreglos() {
const mezcla = [1, "dos", true, null];
return {
arreglo: mezcla,
esArreglo: Array.isArray(mezcla),
largo: mezcla.length,
tipos: mezcla.map((item) => typeof item),
};
}
// --- Reto 8: Funciones como valor ---
// Crea una constante "saludar" que sea una función que reciba un nombre
// y retorne "Hola, {nombre}!".
// Retorna un objeto con:
// { tipoFuncion: typeof saludar, resultado: saludar("JavaScript") }
function funcionComoValor() {
const saludar = (nombre) => `Hola, ${nombre}!`;
return {
tipoFuncion: typeof saludar,
resultado: saludar("JavaScript"),
};
}
// --- Reto 9: Clasificar tipo de dato ---
// Recibe un parámetro "valor".
// Determina si es primitivo o complejo y retorna un objeto con:
// { valor, tipo: typeof valor, clasificacion: "primitivo" | "complejo" }
// Reglas:
// - Si es null, clasificación es "primitivo" (a pesar de typeof).
// - Si typeof es "object" o "function", clasificación es "complejo".
// - En cualquier otro caso, clasificación es "primitivo".
// Pista: primero verifica si es null, luego revisa typeof.
function clasificarTipo(valor) {
let clasificacion;
if (valor === null) {
clasificacion = "primitivo";
} else if (typeof valor === "object" || typeof valor === "function") {
clasificacion = "complejo";
} else {
clasificacion = "primitivo";
}
return {
valor: valor,
tipo: typeof valor,
clasificacion: clasificacion,
};
}
export {
identificarPrimitivos,
diferenciarStringNumber,
explorarNull,
compararNullUndefined,
crearSymbolYBigInt,
crearObjeto,
trabajarConArreglos,
funcionComoValor,
clasificarTipo,
};