La vérification de type des objets dans JS se fait via instanceof, ie
obj instanceof Array
Cela ne fonctionnera pas si l'objet est passé à travers les limites du cadre, car chaque cadre a son propre Arrayobjet. Vous pouvez contourner ce problème en vérifiant la propriété [[Class]] interne de l'objet. Pour l'obtenir, utilisez Object.prototype.toString()(cela est garanti pour fonctionner par ECMA-262):
Object.prototype.toString.call(obj) === '[object Array]'
Les deux méthodes ne fonctionneront que pour les tableaux réels et non pour les objets de type tableau comme les argumentslistes d'objets ou de nœuds. Comme tous les objets de type tableau doivent avoir une lengthpropriété numérique , je les vérifierais comme ceci:
typeof obj !== 'undefined' && obj !== null && typeof obj.length === 'number'
Veuillez noter que les chaînes passeront cette vérification, ce qui pourrait entraîner des problèmes car IE n'autorise pas l'accès aux caractères d'une chaîne par index. Par conséquent, vous souhaiterez peut-être passer typeof obj !== 'undefined'à typeof obj === 'object'pour exclure les primitives et les objets hôtes avec des types distincts de 'object'tous. Cela laissera toujours passer les objets string, qui devront être exclus manuellement.
Dans la plupart des cas, ce que vous voulez vraiment savoir, c'est si vous pouvez parcourir l'objet via des indices numériques. Par conséquent, il peut être judicieux de vérifier si l'objet a une propriété nommée à la 0place, ce qui peut être fait via l'une de ces vérifications:
typeof obj[0] !== 'undefined' // false negative for `obj[0] = undefined`
obj.hasOwnProperty('0') // exclude array-likes with inherited entries
'0' in Object(obj) // include array-likes with inherited entries
Le transtypage en objet est nécessaire pour fonctionner correctement pour les primitives de type tableau (c'est-à-dire les chaînes).
Voici le code pour des vérifications robustes pour les tableaux JS:
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
et objets de type tableau itérables (c'est-à-dire non vides):
function isNonEmptyArrayLike(obj) {
try { // don't bother with `typeof` - just access `length` and `catch`
return obj.length > 0 && '0' in Object(obj);
}
catch(e) {
return false;
}
}