码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript安全的类型检测

时间:2015-05-14 23:48:42      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

        在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()本身是可以被修改的,上面所述的技巧只适用于未修改过原生版本。 

JavaScript安全的类型检测

标签:

原文地址:http://blog.csdn.net/gua_381091614/article/details/45728145

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!