What is typeof in JavaScript?

Dominando el Operador typeof en JavaScript

06/03/2024

Valoración: 4.13 (12107 votos)

En el vasto universo de JavaScript, un lenguaje de tipado dinámico, entender la naturaleza de los datos con los que trabajamos es fundamental. Aquí es donde entra en juego uno de los operadores más básicos pero cruciales: el operador typeof. Su función es simple en apariencia: devolver una cadena de texto que indica el tipo del operando que se le pasa. Sin embargo, como muchas cosas en JavaScript, este operador tiene sus propias peculiaridades y casos especiales que todo desarrollador debe conocer para evitar errores y escribir código más robusto y predecible. Este artículo es una guía exhaustiva que te llevará desde los fundamentos del operador typeof hasta sus comportamientos más complejos y curiosos.

What is typeof in JavaScript?
It’s been available across browsers since July 2015. The typeof operator returns a string indicating the type of the operand's value. An expression representing the object or primitive whose type is to be returned. The following table summarizes the possible return values of typeof.
Índice de Contenido

¿Qué es y cómo se utiliza `typeof`?

El operador typeof es un operador unario que se coloca antes de su único operando, el cual puede ser cualquier variable, literal u objeto. Su sintaxis es directa y sencilla:

typeof operando; // O también, usando paréntesis para mayor claridad en expresiones complejas typeof(operando);

El resultado de esta operación es siempre una cadena de texto (un string). Esta característica es consistente y ha estado presente en JavaScript desde sus primeras versiones, garantizando una amplia compatibilidad entre navegadores y entornos de ejecución.

Los Valores de Retorno de `typeof`

El estándar ECMA-262, que define JavaScript, especifica un conjunto cerrado de posibles cadenas que este operador puede devolver. Es vital memorizar esta lista para poder interpretar correctamente su salida. A continuación, se presenta una tabla que resume todos los posibles resultados.

Tipo de DatoResultado de `typeof`
Undefined"undefined"
Null"object" (¡El caso más famoso y peculiar!)
Boolean"boolean"
Number"number"
BigInt"bigint"
String"string"
Symbol"symbol"
Function"function"
Cualquier otro objeto (incluyendo arrays, new Date(), etc.)"object"

Explorando `typeof` con Tipos de Datos Primitivos

Los tipos de datos primitivos son la base de JavaScript. Veamos cómo se comporta typeof con cada uno de ellos.

Números (Numbers y BigInts)

Para cualquier valor numérico, ya sea entero, decimal, Infinity o incluso NaN (Not-A-Number), el resultado es consistentemente "number".

console.log(typeof 42); // "number" console.log(typeof 3.14159); // "number" console.log(typeof Infinity); // "number" console.log(typeof NaN); // "number" (Aunque su nombre indique lo contrario) console.log(typeof 42n); // "bigint" (Para números enteros de precisión arbitraria)

Cadenas de Texto (Strings)

Cualquier valor encerrado en comillas simples, dobles o plantillas literales (template literals) será identificado como "string".

console.log(typeof "Hola Mundo"); // "string" console.log(typeof 'JavaScript'); // "string" console.log(typeof `ES6`); // "string" console.log(typeof "123"); // "string" (Un número dentro de una cadena es una cadena) // Un caso curioso: typeof siempre devuelve una cadena console.log(typeof typeof 42); // "string"

Booleanos (Booleans)

Los valores lógicos true y false son de tipo "boolean".

console.log(typeof true); // "boolean" console.log(typeof false); // "boolean"

Undefined

Una variable que ha sido declarada pero no inicializada tiene el valor undefined, y su tipo es "undefined". Curiosamente, typeof también devuelve "undefined" para variables que nunca han sido declaradas, lo que lo convierte en una forma segura de verificar su existencia sin provocar un error.

let miVariable; console.log(typeof miVariable); // "undefined" console.log(typeof variableInexistente); // "undefined"

El Curioso Caso de `typeof null`

Uno de los errores más antiguos y famosos de JavaScript es el resultado de typeof null. En lugar de devolver "null", como sería lógico, devuelve "object".

Este comportamiento es un error que data de la primera implementación del lenguaje. En aquel entonces, los valores se representaban con una etiqueta de tipo y un valor. La etiqueta de tipo para los objetos era 0. El valor null se representaba como el puntero nulo (0x00). Como consecuencia, null tenía una etiqueta de tipo 0, y el operador typeof lo interpretaba erróneamente como un objeto. Aunque se propuso una solución, fue rechazada para no romper el código existente que dependía de este comportamiento. Por lo tanto, para verificar si una variable es específicamente null, siempre debes usar una comparación estricta:

let miValor = null; if (miValor === null) { console.log("La variable es null"); }

`typeof` con Objetos y Funciones

Cuando pasamos de los tipos primitivos a los tipos de referencia, el comportamiento de typeof se vuelve menos específico.

Objetos, Arrays y Más

Para la mayoría de los tipos de datos que no son primitivos, typeof simplemente devuelve "object". Esto incluye objetos literales, arrays, objetos `Date`, expresiones regulares y más.

console.log(typeof { a: 1 }); // "object" console.log(typeof [1, 2, 3]); // "object" console.log(typeof new Date()); // "object" console.log(typeof /abc/); // "object"

Esta generalización hace que typeof no sea la herramienta ideal para diferenciar entre distintos tipos de objetos. Para distinguir un array de un objeto, por ejemplo, es mucho mejor utilizar Array.isArray().

Funciones y Clases

Las funciones son un caso especial. Aunque son técnicamente objetos en JavaScript, tienen un tipo propio según typeof: "function". Esto es extremadamente útil para verificar si una variable puede ser invocada. Esto también aplica a las clases de ES6, que son, en esencia, una forma de "azúcar sintáctico" sobre las funciones constructoras.

console.log(typeof function() {}); // "function" console.log(typeof (() => {})); // "function" console.log(typeof Math.sin); // "function" console.log(typeof class C {}); // "function"

Consideraciones Avanzadas y Casos Especiales

Precedencia del Operador y Paréntesis

El operador typeof tiene una alta precedencia. Esto significa que se evalúa antes que operadores binarios como la suma (+). Si no se tiene cuidado, esto puede llevar a resultados inesperados. Es recomendable usar paréntesis para asegurar que se evalúe el tipo de la expresión completa.

let miNumero = 50; // typeof se aplica solo a miNumero, antes de la concatenación console.log(typeof miNumero + " es un número"); // "number es un número" // Los paréntesis fuerzan la evaluación de la expresión primero console.log(typeof (miNumero + " es un número")); // "string"

Variables no Declaradas y la Zona Temporal Muerta (TDZ)

Como mencionamos, typeof es seguro para variables no declaradas (creadas implícitamente en el ámbito global o declaradas con var). Sin embargo, con las declaraciones de bloque de ES6 (let, const y class), la historia es diferente. Si intentas usar typeof en una de estas variables antes de su línea de declaración dentro del mismo bloque, te encontrarás con un ReferenceError. Esto se debe a que la variable existe en la "Zona Temporal Muerta" (Temporal Dead Zone o TDZ), un estado en el que la variable no puede ser accedida.

console.log(typeof miVar); // "undefined" (si no está declarada o es var) { // console.log(typeof miLet); // ReferenceError: Cannot access 'miLet' before initialization let miLet = "hola"; }

Preguntas Frecuentes (FAQ)

1. ¿Por qué `typeof null` devuelve `"object"`?
Es un error histórico de la primera versión de JavaScript que nunca se ha corregido para mantener la retrocompatibilidad del código en la web.
2. ¿Cómo puedo diferenciar un array de un objeto si `typeof` devuelve `"object"` para ambos?
La mejor manera es usar el método estático Array.isArray(valor), que devuelve true si el valor es un array y false en caso contrario.
3. ¿Es `typeof` la mejor manera de verificar el tipo de una variable?
Es excelente y muy rápido para los tipos primitivos (excepto `null`). Sin embargo, para los objetos, es demasiado genérico. Para una verificación más detallada del tipo de objeto, se suelen usar otras técnicas como instanceof o Object.prototype.toString.call().
4. ¿Qué es la "Zona Temporal Muerta" (TDZ) y cómo afecta a `typeof`?
La TDZ es el período entre la entrada a un bloque y la declaración de una variable con `let` o `const`. Durante este tiempo, la variable no puede ser accedida. Usar `typeof` sobre una variable en su TDZ provoca un `ReferenceError`, a diferencia de las variables no declaradas que devuelven `"undefined"`.

Conclusión

El operador typeof es una herramienta fundamental en el arsenal de cualquier desarrollador de JavaScript. Aunque su uso básico es sencillo, dominar sus matices, como el caso de null, su comportamiento con la TDZ y su falta de especificidad con los objetos, es lo que distingue a un programador principiante de uno avanzado. Comprender a fondo cómo funciona typeof te permitirá escribir un código más seguro, depurar problemas de tipo de manera más eficiente y tener una comprensión más profunda del funcionamiento interno del lenguaje.

Si quieres conocer otros artículos parecidos a Dominando el Operador typeof en JavaScript puedes visitar la categoría Juegos.

Subir