2010-05-28 11 views
8

¿Cuál es la forma "correcta" de saber si un objeto es una matriz?forma de JavaScript para saber si un objeto es un Array

function isArray (o) { ??? }

+1

Es posible que desee proporcionar más detalles sobre su entorno, por ejemplo: ¿javascript puro? Correr en un navegador? ¿Hay prototipos u otras bibliotecas disponibles? –

Respuesta

9

La mejor manera:

function isArray(obj) { 
    return Object.prototype.toString.call(obj) == '[object Array]'; 
} 

El ECMAScript 5th Edition Specification define un método para eso, y some browsers, como Firefox 3.7alpha, cromo 5 Beta y las versiones más recientes de WebKit Nightly ya proporcionan una implementación nativa, por lo que es posible que desee implementarla si no está disponible:

if (typeof Array.isArray != 'function') { 
    Array.isArray = function (obj) { 
    return Object.prototype.toString.call(obj) == '[object Array]'; 
    }; 
} 
+0

aún más seguro es 'return Object.prototype.toString.call (obj) === '[objeto Array]';' para evitar cualquier coersión – Rixius

+0

@Rixius: Bueno, el método 'Object.prototype.toString' es [completamente descrito] (http://bclary.com/2004/11/07/#a-15.2.4.2) en la especificación, un valor de retorno 'String' está * garantizado *, no veo ningún beneficio de usar el estricto es igual al operador, cuando sabes que estás comparando dos valores de cadenas ... – CMS

+0

Alguien podría haber golpeado 'Object.prototype.toString' siempre mejor para estar seguro que arrepentido. – Rixius

0

Esto es lo que yo uso:

function is_array(obj) { 
    return (obj.constructor.toString().indexOf("Array") != -1) 
} 
+0

Gracias por responder, no entiendo por qué x.constructor.toString(). IndexOf ("Array") devuelve 9 si su instancia de matriz? ¿Puede usted por favor decirme? – Sudarshan

0
function typeOf(obj) { 
    if (typeof(obj) == 'object') 
    if (obj.length) 
     return 'array'; 
    else 
     return 'object'; 
    } else 
    return typeof(obj); 
} 
0

Puede tomar tomar Prototype definición de la biblioteca del método Object.isArray() que probarlo:

function(object) { 
    return object != null && typeof object == "object" && 
    'splice' in object && 'join' in object; 
} 
+1

El prototipo ya no usa ese método, consulte [aquí] (http://github.com/sstephenson/prototype/blob/1.6.1/src/lang/object.js#L191) cómo se implementa en 1.6.1. – CMS

1

Usted debe ser capaz de utilizar el operador instanceof:

var testArray = []; 

if (testArray instanceof Array) 
    ... 
+1

El único inconveniente de 'instanceof' es cuando trabajas en un entorno DOM de varios fotogramas, un objeto de matriz de un fotograma no es instancia del constructor' Array' de otro fotograma. Ver [este artículo] (http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/) para más detalles. – CMS

1

resuelve jQuery muchos de estos tipos de problemas:

jQuery.isArray(obj)

Cuestiones relacionadas