2010-05-28 3 views
8

Quelle est la bonne façon de dire si un objet est un tableau?La façon de dire si un objet est un tableau JavaScript

La fonction isArray (o) { ??? }

+1

Vous pouvez fournir plus de détails sur votre environnement, par exemple: javascript pur? Courir dans un navigateur? Des prototypes ou d'autres bibliothèques sont-ils disponibles? –

Répondre

9

La meilleure façon:

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

Le ECMAScript 5th Edition Specification définit une méthode pour cela, et some browsers, comme Firefox 3.7alpha, Chrome 5 version bêta et les dernières versions de WebKit Nightly fournissent déjà une implémentation native. Vous pouvez donc l'implémenter si elle n'est pas disponible:

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

encore plus sûr est 'retourner Object.prototype.toString.call (obj) === '[tableau d'objets]';' pour éviter toute coersion possible – Rixius

+0

@Rixius: Eh bien, la méthode 'Object.prototype.toString' est [entièrement décrit] (http://bclary.com/2004/11/07/#a-15.2.4.2) dans la spécification, une valeur de retour 'String' est * garanti *, je ne vois aucun avantage à utiliser le strict est égal à l'opérateur, quand vous savez que vous comparez deux valeurs de chaînes ... – CMS

+0

Quelqu'un aurait pu mettre en garde 'Object.prototype.toString' pour mieux prévenir que guérir. – Rixius

0

C'est ce que j'utilise:

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

Merci pour la réponse, je ne comprends pas pourquoi x.constructor.toString(). IndexOf ("Array") renvoie 9 si son instance de tableau? peux-tu me dire s'il te plait? – Sudarshan

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

Vous pouvez prendre la définition bibliothèque de méthode Object.isArray() Prototype dont le test:

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

Prototype n'utilise plus cette méthode, voir [ici] (http://github.com/sstephenson/prototype/blob/1.6.1/src/lang/object.js#L191) comment il est implémenté en 1.6.1. – CMS

1

Vous devriez pouvoir utiliser l'opérateur instanceof:

var testArray = []; 

if (testArray instanceof Array) 
    ... 
+1

Le seul inconvénient de 'instanceof' est lorsque vous travaillez dans un environnement DOM multi-frame, un objet de tableau forme un cadre n'est pas une instance du constructeur' Array' de l'autre image. Voir [cet article] (http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/) pour plus de détails. – CMS

1

permet de résoudre jQuery beaucoup de ces sortes de questions:

jQuery.isArray(obj)

Questions connexes