js中判斷是否爲一個函數

怎麼判斷一個對象是一個函數呢?通常狀況下,咱們都是使用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),函數執行過程以下:函數

  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)

使用方法以下:this

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

參考資料Object.prototype.toString() - JavaScript | MDNfirefox

相關文章
相關標籤/搜索