假设我有任何变量,其定义如下:
var a = function() {/* Statements */};
我想要一个函数来检查变量的类型是否类似于函数。IE :
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
如何检查变量a
是否属于Function
上述定义的类型?
假设我有任何变量,其定义如下:
var a = function() {/* Statements */};
我想要一个函数来检查变量的类型是否类似于函数。IE :
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
如何检查变量a
是否属于Function
上述定义的类型?
if (typeof v === 'function') {
// do something
}
当然下划线的方式更有效,但是当效率不是问题时,检查的最佳方法是写在@Paul Rosania 链接的下划线页面上。
受下划线启发,最终的 isFunction 函数如下:
function isFunction(functionToCheck) {
return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}
注意:此解决方案不适用于异步函数、生成器或代理函数。有关更多最新解决方案,请参阅其他答案。
有几种方法,所以我将总结它们
function foo(v) {if (v instanceof Function) {/* 做某事 */} };最高效(无字符串比较)和优雅的解决方案 - instanceof 运算符在浏览器中已经被支持很长时间了,所以不用担心 - 它可以在 IE 6 中工作。
function foo(v) {if (typeof v === "function") {/* 做某事 */} };缺点
typeof
是它很容易出现无声失败,不好,所以如果你有一个错字(例如“finction”) - 在这种情况下,`if` 只会返回 false 并且你不会知道你有错误,直到稍后你的代码
函数 isFunction(functionToCheck) { var getType = {}; return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; }这与解决方案 #1 或 #2 相比没有优势,但可读性要差得多。这个的改进版本是
函数 isFunction(x) { return Object.prototype.toString.call(x) == '[object Function]'; }但仍然比解决方案#1 少很多语义
Underscore.js使用了一个更复杂但性能更高的测试:
_.isFunction = function(obj) {
return !!(obj && obj.constructor && obj.call && obj.apply);
};
请参阅:http : //jsperf.com/alternative-isfunction-implementations
编辑:更新的测试表明 typeof 可能更快,请参阅http://jsperf.com/alternative-isfunction-implementations/4