¿Cuál es la mejor manera de verificar si un objeto es una matriz o no en Javascript?
-
05-07-2019 - |
Pregunta
Diga que tengo una función como esta:
function foo(bar) {
if (bar > 1) {
return [1,2,3];
} else {
return 1;
}
}
Y digamos que llamo foo (1)
, ¿cómo puedo saber si devuelve una matriz o no?
Solución
Uso esta función:
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
Es la forma en que se implementa jQuery.isArray .
Revisa este artículo:
Otros consejos
if(foo(1) instanceof Array)
// You have an Array
else
// You don't
Actualización: Tengo que responder a los comentarios que se hacen a continuación, porque las personas siguen diciendo que esto no funcionará sin probarlo por sí mismos ...
Para algunos otros objetos, esta técnica no funciona (por ejemplo, " " instanceof String == false), pero esto funciona para Array. Lo probé en IE6, IE8, FF, Chrome y Safari. Pruébalo y compruébalo por ti mismo antes de comentar a continuación.
Aquí hay una manera muy confiable, tome de Javascript: las partes buenas, publicadas por O'Reilly:
if (my_value && typeof my_value === 'object' && typeof my_value.length === 'number' &&
!(my_value.propertyIsEnumerable('length')) { // my_value is truly an array! }
Sugeriría envolverlo en tu propia función:
function isarray(my_value) {
if (my_value && typeof my_value === 'object' && typeof my_value.length === 'number' &&
!(my_value.propertyIsEnumerable('length'))
{ return true; }
else { return false; }
}
A partir de ES5 hay isArray
.
Array.isArray([]) // true
Para que su solución sea más general, es posible que no le importe si es realmente un objeto Array. Por ejemplo, document.getElementsByName () devuelve un objeto que " actúa como " una matriz. " Cumplimiento de matrices " se puede asumir si el objeto tiene una " longitud " propiedad.
function is_array_compliant(obj){
return obj && typeof obj.length != 'undefined';
}