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.
¿Por qué typeof no es adecuado?
\n\nAntes 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:
const arr = [1, 2, 3];\nconsole.log(typeof arr); // "object" — inútil\n\nAdemá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.
Método 1: Array.isArray() — el estándar moderno
\n\nA 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.
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.
Soporte de navegadores
\nEl 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\nMétodo 2: instanceof Array — el clásico del género
\n\nEl 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í:
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\nAquí 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.
Método 3: Object.prototype.toString.call() — el soldado universal
\n\nEste 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.
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.