怎么判断一个对象是一个函数呢?一般情况下,我们都是使用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),函数执行过程如下:
- Get the [[Class]] property of this object.
- Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
- Return Result (2)
使用方法如下:
function isFunction(fn) {
return Object.prototype.toString.call(fn)=== '[object Function]';
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。