HOWTO · JavaScript

Compruebe si un valor es un objeto en JavaScript

En este tutorial comprobaremos si un valor es un objeto en JavaScript

En esta página

Para comprobar si un valor de JavaScript es un objeto, usa typeof value === "object" && value !== null. Este predicado incluye los arrays y otros objetos, pero excluye null y las funciones. Si tu código también debe aceptar funciones, añade typeof value === "function" a la condición. Elige la regla que se ajuste a lo que necesita tu programa: JavaScript trata las funciones como objetos invocables, mientras que typeof las informa por separado.

Usa instanceof para comprobar si un valor es un objeto en JavaScript

instanceof es un operador que comprueba si el prototipo de un constructor aparece en la cadena de prototipos de un valor. Para un objeto simple creado en el mismo entorno de JavaScript, value instanceof Object suele ser verdadero. Esto resulta útil cuando quieres comprobar si una instancia está asociada a un constructor concreto, como en value instanceof Date.

No es un predicado universal para detectar objetos. Un objeto creado con Object.create(null) no tiene Object.prototype en su cadena, por lo que instanceof Object da falso. Los objetos creados en otro entorno, como otra ventana o un iframe del navegador, también tienen constructores y prototipos distintos; un objeto de ese entorno puede no superar la comprobación instanceof Object del entorno actual. Si necesitas una comprobación general de objetos que cubra estos casos, usa un predicado basado en typeof.

Usa typeof para comprobar si un valor es un objeto en JavaScript

typeof es un operador, no una función, y no necesita paréntesis alrededor del valor. Para los objetos habituales, incluidos los arrays, typeof value devuelve "object". Hay que tener presentes dos resultados: typeof null también devuelve "object", mientras que typeof aplicado a una función devuelve "function". Por tanto, comparar únicamente con "object" incluye null y excluye las funciones. Si quieres detectar objetos, pero no valores nulos, añade una comprobación explícita de null.

Define una comprobación reutilizable de objetos

Este predicado devuelve true para los objetos que no son nulos y false para las funciones, los valores primitivos y null. El ejemplo muestra el resultado para un objeto, un valor nulo, un número y una función.

function isObject(value) {
  return value !== null && typeof value === "object";
}

const person = { name: "Ada" };
console.log(isObject(person));
console.log(isObject(null));
console.log(isObject(42));
console.log(isObject(() => {}));

Cada llamada imprime un resultado booleano, en el mismo orden que las entradas. Esta definición responde intencionadamente a la pregunta «¿es este un objeto que no es nulo?». Si, para tu caso, una función también debe contar como objeto, usa value !== null && (typeof value === "object" || typeof value === "function"). Para este propósito, evita comprobar value.constructor.toString(): un valor puede no tener el constructor esperado, y los nombres o el código fuente de los constructores no son una prueba de tipo general fiable. El patrón Object(value) === value también aplica conversiones que pueden ocultar el propósito concreto del predicado.

Usa Object.getPrototypeOf() para inspeccionar el prototipo de un objeto

Object.getPrototypeOf(value) responde a otra pregunta: devuelve el prototipo de un objeto. Por ejemplo, Object.getPrototypeOf(Object.create(null)) devuelve null, mientras que Object.getPrototypeOf({}) devuelve Object.prototype. Esto puede servir para inspeccionar la herencia o comparar el prototipo de un valor con uno conocido, pero no sustituye a un predicado para detectar objetos. Pasar null o undefined a Object.getPrototypeOf() provoca un TypeError; los demás valores primitivos se convierten en objetos antes de que se devuelva su prototipo. Usa este método solo cuando necesites inspeccionar un prototipo, no como comprobación general de objetos.