怎麼判斷一個對象是一個函數呢?通常狀況下,咱們都是使用typeof
來進行類型判斷,可是這個辦法並非想象的那麼好用,偶然使用typeof
來判斷正則表達式時,發如今firefox2中返回的是"object",firefox3中返回"function",特介紹一種穩定的判斷方案:node
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),函數執行過程以下:函數
使用方法以下:this
function isFunction(fn) { return Object.prototype.toString.call(fn)=== '[object Function]'; }