一、安全的类型检测
JavaScript 内置的类型检测机制并非完全可靠。事实上,发生错误否定及错误肯定的情况也不在少
数。比如说typeof操作符吧,由于它有一些无法预知的行为,经常会导致检测数据类型时得到不靠谱
的结果。Safari(直至第 4 版)在对正则表达式应用typeof操作符时会返回"function",因此很难确
定某个值到底是不是函数。
再比如,instanceof操作符在存在多个全局作用域(像一个页面包含多个 frame)的情况下,也
是问题多多。一个经典的例子(第 5 章也提到过)就是像下面这样将对象标识为数组。
var isArray = value instanceof Array;
以上代码要返回true,value必须是一个数组,而且还必须与Array构造函数在同个全局作用域
中。(别忘了,Array是window的属性。)如果value是在另个 frame 中定义的数组,那么以上代码
就会返回false。
在检测某个对象到底是原生对象还是开发人员自定义的对象的时候,也会有问题。出现这个问题的
原因是浏览器开始原生支持JSON对象了。因为很多人一直在使用 Douglas Crockford 的 JSON 库,而该
库定义了一个全局JSON对象。于是开发人员很难确定页面中的JSON对象到底是不是原生的。
原理:在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串
//写成公用函数
function type(val){
return Object.prototype.toString.call(val)
} |