众所周知,我们在ES5中可以使用Array.isArray()函数来判断传入值是否为数组类型
在ES5之前,我们拥有typeof操作符,但它对数组只能返回"Object"(并且对于所有非函数的对象都是如此)
而instanceof操作符只能用于简单的情形,如:
[] instanceof Array // true
({}) instanceof Array // false
使用instanceof的问题:
在Web浏览器中有可能有多个窗口或者窗体(frame)存在,每个frame都有自己的JavaScript环境,有自己的全局对象,并且每个全局对象有自己的一组构造函数,因此一个frame中的对象将不可能是另外窗体中的构造函数的实例。窗体之间的混淆不常发生,但这个问题足以证明instanceof操作符不能视为一个可靠的数组检测方法。
解决方案:
检查对象的类属性——对数组而言,该属性的值总是“Array”
我们使用Object.prototype.toString()方法,在ES3中,可以将isArray()函数的代码这样写:
var isArray = Function.isArray || function(o) {
return typeof 0 === "object" &&
Object.prototype.toString.call(o) === "[object Array]"
}
实际上,此处类属性的检测就是ES5中Array.isArray()函数所做的事情。