首先,在各个浏览器中 HTML元素节点 的返回值有所差别:node
一、Firefox2 和 Firefox3 git
在这两个浏览器中,用 typeof 检测 HTML 对象元素的类型,获得是一个不精确的 “function” 结果,而不是 “object”,如 HTMLDocument。如: github
alert(typeof HTMLDocument);
// 在 Firefox2 中结果是 "function";
// 在 Firefox3 中结果是 "object";
二、Firefox2 正则表达式
对于正则表达式,在该浏览器中返回的结果是 “function”(在 Firefox3 中结果是 “object”),如: 浏览器
var reg = /test/;
alert(typeof reg);
// 在 Firefox2 中结果是 "function";
// 在 Firefox3 中结果是 "object";
注:本人在 safari 中测试,其结果也是 “function”。 app
三、IE6 和 IE7 函数
在 IE 中对 DOM 元素使用 typeof 方法,获得的结果是 “object”。如: 测试
alert(typeof document.getElementsByTagName("body")[0].getAttribute);
// 结果是 "object"
四、Safari 3
safari 认为 DOM 元素的 NodeList 是一个函数,如: 优化
alert(typeof document.body.childNodes);
// 结果是 "function"
很明显,若是你要测试一个对象是否为函数,使用 typeof 方法并不能从真正意义上保证测试结果。那么,咱们就须要一种在全部浏览器中都能保证测试结果的解决方案。咱们知道 function 自己有 apply() 和 call() 两种方法,但这两个方法在 IE 中存在问题的函数中并不存在,试试下面的测试: spa
alert(typeof document.getElementsByTagName("body")[0].getAttribute.call)
// 在 IE 中结果是 "undefined"
因此有一种方法:
function isFunction(fn) {
return !!fn && !fn.nodeName && fn.constructor != String &&
fn.constructor != RegExp && fn.constructor != Array &&
/function/i.test(fn + "");
}
参考: http://www.jb51.net/article/19841.htm
此外还有一种方法:
/** * 判断对象是否为函数,若是当前运行环境对可调用对象(如正则表达式) * 的typeof返回'function',采用通用方法,不然采用优化方法 * * @param {Any} arg 须要检测是否为函数的对象 * @return {boolean} 若是参数是函数,返回true,不然false */ function isFunction(arg) { if (arg) { if (typeof (/./) !== 'function') { return typeof arg === 'function'; } else { return Object.prototype.toString.call(arg) === '[object Function]'; } } // end if return false; }