JavaScript内置的类型检测机制并非完全可靠。比如:

1
var isArray = value instanceof Array;

以上代码要返回true,value必须是一个数组,而且还必须与Array构造函数在同个全局作用域中。(别忘了,Array是window的属性。)如果value是在另个frame中定义的数组,那么以上代码就会返回false。

解决方法: 众所周知,在任何值上调用Object原生的toString()方法,都会返回一个[obj ect NativeConstructorName] 格式的字符串。每个类在内部都有一个[ [Class]]属性,这个属性中就指定了上述字符串中的构造函数名。

由于原生数组的构造函数名与全局作用域无关,因此使用toString()就能保证返回一致的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//检测是否是原生数组
function isArray(value) {
return Object.prototype.toString.call(value) == "[object Array]";
}
//检测是否是原生函数
function isFunction(value) {
return Object.prototype.toString.call(value) == "[object Function]";
}
//检测是否是原生正则
function isRegExp(value) {
return Object.prototype.toString.call(value) == "[object RegExp]";
}
//检测是否是原生JSON
var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON) == "[object JSON]";

有一点我们要注意object . prototpye. toString()本身也可能会被修改。所以我们讨论的技巧是假设0bject. prototpye. toString()是未被修改过的原生版本的情况下。



愿你的坚持终有收获。