What is the best way to check if an object is an array or not in Javascript?
假设我有这样的功能:
1 2 3 4 5 6 7 | function foo(bar) { if (bar > 1) { return [1,2,3]; } else { return 1; } } |
假设我调用
我使用这个函数:
1 2 3 | function isArray(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; } |
是jquery.isarray的实现方式。
检查本文:
- 伊萨雷:为什么这么血腥很难纠正?
1 2 3 4 | if(foo(1) instanceof Array) // You have an Array else // You don't |
更新:我必须对下面的评论作出回应,因为人们仍然声称,如果不亲自尝试,这是行不通的…
对于其他一些对象,此技术不起作用(例如,"instanceof string==false"),但对数组有效。我在IE6、IE8、FF、Chrome和Safari中测试过。在下面评论之前,你自己试试看。
这里有一个非常可靠的方法,从javascript中获取:好的部分,由O'Reilly发布:
1 2 | if (my_value && typeof my_value === 'object' && typeof my_value.length === 'number' && !(my_value.propertyIsEnumerable('length')) { // my_value is truly an array! } |
我建议将其包装在您自己的功能中:
1 2 3 4 5 6 7 | 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; } } |
从ES5开始,有
1 | Array.isArray([]) // true |
为了使您的解决方案更通用,您可能不关心它是否实际上是一个数组对象。例如,document.getElementsByName()返回一个"类似于数组"的对象。如果对象具有"长度"属性,则可以假定"数组符合性"。
1 2 3 | function is_array_compliant(obj){ return obj && typeof obj.length != 'undefined'; } |