JavaScript安全的类型检测

        在JavaScript中,内置的类型检测机制并非是完全可靠的。这里分别指的typeof和instanceof关键字。
        由于typeof有一些无法预知的行为,经常会导致检测数据类型时得到不靠谱的结果,Safari在对正则表达式应用typeof时会返回“function”,在chrome下回返回“object”。
        instanceof存在多个全局作用域的情况下(指的是一个页面中包含iframe),也是问题多多。比如下面的代码:
                                                       
var isArray = value instanceof Array;


        以上代码若要返回true,value必须是一个数组,而且还必须与Array在同一个全局作用域中。如果value是另一个iframe中定义的数组,那么上面的代码就会返回false。
        在检测某个对象到底是原生对象还是开发人员自定义的对象的时候,也会有问题。就比如JSON对象,因为很多人一直使用Douglas Crockford的JSON库,这个库定义的是一个全局的JSON对象,但是现在新的浏览器都已经原生支持JSON对象了,不需要依赖外部库了。于是就很难确定页面中用的JSON对象到底是不是原生的。
         解决上面问题的方法都一样的。首先大家要知道,在任何值上调用Object原生的toString方法,都会返回一个[objcet xxx]格式的字符串。每个类在内部都有一个class属性,这个属性中就制定了上面字符串中的构造函数名。举个例子吧:
                                                      
console.log(Object.prototype.toString.call([]));//[object Array] 
console.log(Object.prototype.toString.call(window.Array));//[object function] 
console.log(Object.prototype.toString.call(Object));//[object function]   
console.log(Object.prototype.toString.call(window));//[object global]   
console.log(Object.prototype.toString.call(/^\d/));//[object RegExp]    
console.log(Object.prototype.toString.call(new Object()));//[object Object] 

       
        由于构造函数名与全局作用域无关,因此使用toString()就能保证返回一致的值。利用这一点我们就能创建准确判断对象类型的函数了。比如:
function isFunction(value){
        return Object.prototype.toString.call(value)=="[object Function]";
}


        不过要注意的是IE中以COM对象形式实现的任何函数,isFunction都将返回false(因为它们都不是原生的JavaScript函数)。
        在web开发中,能够区分原生与非原生JavaScript对象是非常重要的。只有这样才能准确的知道某个对象到底有哪些功能。这个技巧可以对任何对象给出正确的结论,所以今后在编程的过程中,需要判断对象类型的时候我们要摈弃typeof和instanceof。
        最后说一个很重要的注意事项:Object.prototype.toString()本身是可以被修改的,上面所述的技巧只适用于未修改过原生版本。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值