1. typeof

Primero pensaríamos en usar typeof para detectar el tipo de dato, pero para estos tipos básicos como Function, String, Number, Undefined, etc., usar typeof puede detectarlos, por ejemplo, el siguiente código:

function test(){} console.log(typeof 1); // number console.log(typeof test); // function console.log(typeof "yunxi"); // string console.log(typeof undefined); // undefined

Pero para arrays o expresiones regulares, usar typeof no es suficiente, porque cuando detectamos un array o una expresión regular, el tipo devuelto será un objeto (object), como se muestra en el siguiente código:

console.log(typeof []); // object console.log(typeof /\d+/g); // object

2. Instanceof

Por lo tanto, es fácil pensar en usar instanceof para detectar si un objeto es una instancia de array. Esta detección devuelve un booleano (boolean); si es un array, devuelve true; de lo contrario, devuelve false. Veamos nuevamente el código anterior para detectar si es un array:

console.log([] instanceof Array); // true console.log(/\d+/g instanceof Array); // false

Como se puede ver arriba, usar instanceof realmente puede determinar si es un array.

3. Propiedad constructor

En JavaScript, cada objeto tiene una propiedad constructor que hace referencia al constructor que inicializó el objeto, por ejemplo, para determinar el tipo de un objeto desconocido. Por lo tanto, podemos escribir un método de la siguiente manera, el código es:

function isArray(obj) { return typeof obj == 'object' && obj.constructor == Array } //Demo de prueba console.log(isArray([])); // true var a = {"a":1}; console.log(isArray(a)); // false var b = [1,2,3]; console.log(isArray(b)); // true console.log(isArray(/\d+/g));// false

Como se puede ver arriba, llamando al método isArray también se puede determinar si es un array.

Ahora podemos ver que, para el segundo y tercer punto, usar el método instanceof y la propiedad constructor respectivamente parece poder determinar si es un array, pero también hay excepciones. Por ejemplo, cuando se usa un array de una página en un iframe de otro marco (cross-frame), fallará, porque en diferentes marcos (iframes), los arrays creados no comparten sus propiedades prototype entre sí; el siguiente código lo verifica ~

var iframe = document.createElement('iframe'); document.body.appendChild(iframe); xArray = window.frames[window.frames.length-1].Array; var arr = new xArray("1","2","3","4","5"); //Esta forma no es compatible con IE; en navegadores estándar como Firefox y Chrome sí lo es. console.log(arr); //Imprime ["1", "2", "3", "4", "5"] console.log(arr instanceof Array); // false console.log(arr.constructor === Array); // false

Ninguno de los métodos anteriores puede determinar si un objeto es un array; pero al revisar ECMA262 podemos ver que se puede usar el método Object.prototype.toString.call() para determinar si un objeto es un array; como el siguiente código:

function isArray(obj) { return Object.prototype.toString.call(obj) == '[object Array]'; } //Llamada al código console.log(isArray([])); // true console.log(isArray([1,2,3])); // true var iframe = document.createElement('iframe'); document.body.appendChild(iframe); xArray = window.frames[window.frames.length-1].Array; var arr = new xArray("1","2","3","4","5"); console.log(arr); // ["1","2","3","4","5"] console.log(isArray(arr)); // true