Cómo verificar si un objeto es un array en JavaScript: 3 mejores formas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cómo verificar si un objeto es un array en JavaScript: guía completa

\n\n

¿Alguna vez te has encontrado pensando: «Al parecer pasaron un array, pero el código falla con un error»? Situación familiar. En JavaScript, los arrays son objetos, y la simple verificación con typeof no funcionará aquí. Hoy analizaremos tres formas principales de verificar si un objeto es un array y descubriremos cuál de ellas vale la pena usar en proyectos reales.

\n\n

¿Por qué typeof no es adecuado?

\n\n

Antes de sumergirnos en los detalles, entendamos por qué los principiantes suelen tropezar en este punto. En JavaScript, los arrays son un caso especial de objetos. Por lo tanto, el operador typeof para un array devolverá "object", no "array". Pruébalo tú mismo:

\n\n
const arr = [1, 2, 3];\nconsole.log(typeof arr); // "object" — inútil
\n\n

Además, typeof null === "object" es un error conocido del lenguaje que ya no se corregirá. Así que si estás verificando datos del usuario o de una API, no puedes confiar en typeof. Se necesitan métodos más fiables.

\n\n

Método 1: Array.isArray() — el estándar moderno

\n\n

A partir de ES5 (2009), JavaScript introdujo el método incorporado Array.isArray(). Esta es la forma más correcta y sencilla de verificar si un objeto es un array.

\n\n
const arr = [10, 20, 30];\nconst notArr = { length: 3, 0: 'a', 1: 'b', 2: 'c' };\n\nconsole.log(Array.isArray(arr));    // true\nconsole.log(Array.isArray(notArr)); // false\nconsole.log(Array.isArray('hello')); // false\nconsole.log(Array.isArray(null));    // false
\n\n

¿Por qué es la mejor opción? Porque Array.isArray() funciona correctamente incluso en escenarios complejos: si el array proviene de otro iframe o frame, instanceof puede fallar, pero Array.isArray() no. Verifica el tipo interno [[Class]] del objeto, no la cadena de prototipos.

\n\n

Soporte de navegadores

\n

El método es compatible con todos los navegadores modernos, incluido Internet Explorer 9+. Si necesitas soportar navegadores muy antiguos (IE 8 y anteriores), usa un polyfill o el tercer método.

\n\n

Método 2: instanceof Array — el clásico del género

\n\n

El operador instanceof verifica si el prototipo Array.prototype está presente en la cadena de prototipos del objeto. Suena complicado, pero en la práctica funciona así:

\n\n
const arr = [1, 2, 3];\nconsole.log(arr instanceof Array); // true\n\nconst obj = { a: 1 };\nconsole.log(obj instanceof Array); // false\n\n// Y aquí viene la sorpresa:\nconst iframeArr = new iframe.contentWindow.Array(1, 2, 3);\nconsole.log(iframeArr instanceof Array); // false! (si el array es de otro frame)
\n\n

Aquí está el truco: si tienes varios iframes en la página o trabajas con Web Workers, los arrays de diferentes contextos globales tienen prototipos distintos. instanceof no tiene esto en cuenta y puede devolver false para un array real. Por lo tanto, en el desarrollo moderno es mejor evitar instanceof para verificar arrays.

\n\n

Método 3: Object.prototype.toString.call() — el soldado universal

\n\n

Este método se usaba antes de la aparición de Array.isArray(). Sigue siendo relevante si necesitas escribir un polyfill o trabajar en un entorno donde Array.isArray no está disponible.

\n\n
function isArray(obj) {\n  return Object.prototype.toString.call(obj) === '[object Array]';\n}\n\nconsole.log(isArray([1, 2]));      // true\nconsole.log(isArray({ a: 1 }));    // false\nconsole.log(isArray('string'));    // false\nconsole.log(isArray(null));        // false
\n\n

¿Cómo funciona? El método toString del objeto Object.prototype devuelve una cadena con el formato [object Type]. Para los arrays, esto siempre es [object Array]. Este método evita el problema de los iframes porque verifica el tipo interno.

Blogs

Book Recommendations