3

怎么判断一个对象是一个函数呢?一般情况下,我们都是使用typeof来进行类型判断,但是这个办法并不是想象的那么好用,偶然使用typeof来判断正则表达式时,发现在firefox2中返回的是"object",firefox3中返回"function",特介绍一种稳定的判断方案:


function isFunction(fn) {
    return (!!fn&&!fn.nodename&&fn.constructor!=String&&fn.constructor!=RegExp&&fn.constructor!=Array&&/function/i.test(fn+""));
}

解释:首先判断对象存在,检测是不是DOM元素,constructor指向创建当前对象的构造函数,那么这些fn.constructor!=String&&fn.constructor!=RegExp&&fn.constructor!=Array大家就能明白了吧,最后一个表达式/function/i.test(fn+""),先将fn转换成字符串,类似于"function name(){...}",然后查找字符串中有没有“function”,/i表示查找模式中忽略大小写

看了评论之后,推荐一种更好用的办法,能够判断Array,String,Data,Function,Boolean,Number等类型。Object.prototype.toString()来实现,这个函数可以获得对象的内部属性(class),函数执行过程如下:

  1. Get the [[Class]] property of this object.
  2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
  3. Return Result (2)

使用方法如下:


function isFunction(fn) {
   return Object.prototype.toString.call(fn)=== '[object Function]';
}

参考资料Object.prototype.toString() - JavaScript | MDN


点不着蚊香
560 声望8 粉丝

即将混迹前端的程序媛(头像是我汉子,别误会=.=)