typeof es un operador JavaScript que al ser llamado sobre una variable, devuelve el tipo de dato que dicha variable contiene. Entre otras cosas, podemos utilizarlo para validar de parámetros de una función o para comprobar si una variable ha sido definida.

El operador typeof es muy útil porque nos permite consultar fácilmente el tipo de datos que una variable contiene. Esto es importante en JavaScript porque se trata de un lenguaje escrito dinámicamente. Esto significa que no necesitamos asignar un tipo de datos fijo a una variable cuando la creamos. Al no restringir las variables de esta manera, el tipo de datos que contienen puede cambiar durante la ejecución de un programa.

Por ejemplo:

var x = 12345; // number
x = 'string'; // string
x = { key: 'value' }; // object

Como podemos ver en el ejemplo anterior, una variable puede cambiar de tipo durante la ejecución de un programa. En nuestro trabajo diario puede ser complejo llevar un registro de estos cambios y es en esos casos donde el operador typeof será útil.

El operador typeof devuelve una cadena de texto que representa el tipo de dato actualmente contenido en una variable. Para usarlo podemos escribir typeof(variable) o typeof variable. Volviendo al ejemplo anterior, podemos utilizarlo para comprobar el tipo de dato de la variable x en cada paso:

var x = 12345; 
console.log(typeof x) // number
x = 'string'; 
console.log(typeof x) // string
x = { key: 'value' };
console.log(typeof x) // object

De esta manera, por ejemplo, podemos comprobar el tipo de dato de una variable dentro de una función y continuar en caso de obtener el resultado esperado.

Aquí tenemos una función de ejemplo que puede tomar una variable y anunciar si es una cadena de texto o un número:

function doSomething(x) {
  if(typeof(x) === 'string') {
    alert('x is a string')
  } else if(typeof(x) === 'number') {
    alert('x is a number')
  }
}

También podemos utilizar el operador typeof para asegurarnos de que una variable ha sido definida antes de utilizarla en nuestro código. Esto puede ser útil para prevenir un error muy común, intentar acceder a una variable cuyo valor aún no ha sido definido.

function(x){
  if (typeof(x) === 'undefined') {
    console.log('variable x is not defined');
    return;
  }
  // aquí continuamos con la función...
}

Cuando trabajamos con números, el valor que devuelve el operador typeof puede no ser lo que estamos esperando.

Los números pueden convertirse en NAN (No es un número) por distintos motivos.

console.log(typeof NaN); //"number"

Quizás estamos intentando multiplicar un número con un objeto, porque olvidamos acceder al número que ese objeto contiene:

var x = 1;
var y = { number: 2 };
console.log(x * y); // NaN
console.log(typeof (x * y)); // number

En este caso, no será suficiente utilizar typeof para comprobar que el resultado es un número, ya que NaN también cumple con esta condición.

En la siguiente función, vamos a comprobar que el valor es un número pero excluyendo a NaN de la condición:

function isNumber(data) {
  return (typeof data === 'number' && !isNan(data));
}

Si bien este es un método muy útil para validar tipos de datos, también debemos tener cuidado porque JavaScript tiene algunas rarezas y entre ellas encontramos el resultado de typeof en algunas situaciones particulares. En JavaScript muchas cosas son inesperadamente objetos, como por ejemplo los arreglos (arrays) y los valores null

var x = [1,2,3,4]; 
console.log(typeof x)  // object

console.log(typeof null)  // object

Traducido del artículo - JavaScript Data Types: Typeof Explained