在SO和Google中发现的有关检查对象是否为数组的每个问题最有可能以该解决方案结束
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]'
}
所有其他替代方案都有误报或不完全支持.
资料来源:
http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
How to detect if a variable is an array
当我阅读15.4.3.2部分的ES5规范时,发现针对Array.isArray函数描述的算法在IE9,Chrome 5,Firefox 4,Opera 10.5和Safari 5中执行相同的检查,但是此算法有两个额外步骤.
function isArray(obj) {
if (typeof obj !== 'object') {
return false;
}
// Here they check only against the [[Class]] part
// and of course they don't have to use the ugly Object.prototype.toString.call
// but this is pretty much the same comparison
if (Object.prototype.toString.call(obj) === '[object Array]') {
return true;
}
return false;
}
现在我的问题是为什么他们要先检查类型?是否有一种特殊情况,对于仍然具有[[Array]]内部类的对象,该方法将返回false?
解决方法:
让我们看一下算法:
- If Type(arg) is not Object, return false.
- If the value of the [[Class]] internal property of arg is “Array”, then return true.
- Return false.
该算法包含此检查,因为不是对象的值不具有internal properties.但是由于该算法访问值的内部属性[[Class]],因此必须断言该值是一个对象.
对于polyfill,确实不需要进行此检查,因为它们不会访问值的任何属性.但是,它的确使Polyfill更接近规格.