一般在js里,我们一般使用typeof 、instanceof进行类型检测,例如:检测某个对象是否为数组:
if (value instanceof Array){
// 执行相关的代码
}
但这段代码只在有且只有一个全局执行环境中才成立,在红宝书中对此有这么一段定义:
如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数
所幸ECMAScript 5 新增了Array.isArray()方法用于数组的检测,
if (Array.isArray(value)){
// 执行数组相关代码
}
但该方法只得到了IE9+、Firefox 4.0+、Safari 5+、Opera 10.5+和 Chrome的支持,对于不知持该方法的浏览器,就要自己手动实现一个isArray(), 实现isArray的方法是使用Object中的toString()方法,返回一个[object NativeConstruectorName]格式的字符串,由于原生数组的构造函数名和全局作用域无关,因此不用担心多个框架问题:
function isArray(value) {
return Object.prototype.toString.call(value) == '[object Array]'
}