var util = require('util');
util.isFunction(object);
84
以前的一些答案显示的解决方案是使用typeof . 以下是NodeJs中的代码片段,
function startx() {
console.log("startx function called.");
}
var fct= {};
fct["/startx"] = startx;
if (typeof fct[/startx] === 'function') { //check if function then execute it
fct[/startx]();
}
17 回答
我发现在IE8中测试本机浏览器功能时,使用
toString
,instanceof
和typeof
不起作用 . 这是一个在IE8中工作正常的方法(据我所知):或者,您可以使用以下方法检查本机功能:
虽然,我已经在某处读过,这在IE7及以下版本中并不总是有效 .
有几种方法可以总结它们
性能最佳(没有字符串比较)和优雅的解决方案 - 在浏览器中支持instanceof运算符很长一段时间,所以不要担心 - 它将在IE 6中运行 .
typeof
的缺点是它容易出现静音失败,不好,所以如果你有一个拼写错误(例如"finction") - 在这种情况下,if
只会返回false并且你不会认识你在您的代码中稍后会出现错误这没有解决方案#1或#2的优势,但可读性差得多 . 这方面的改进版本是
,但仍然比解决方案#1少得多
Underscore.js使用更精细但高性能的测试:
见:http://jsperf.com/alternative-isfunction-implementations
编辑:更新的测试表明typeof可能更快,请参阅http://jsperf.com/alternative-isfunction-implementations/4
jQuery (自版本3.3起不推荐使用)Reference
AngularJS Reference
Lodash Reference
Underscore Reference
Node.js 自v4.0.0以来已弃用Reference
以前的一些答案显示的解决方案是使用typeof . 以下是NodeJs中的代码片段,
以下似乎也适合我(从
node.js
测试):对于那些对函数风格感兴趣的人,或者想要在元编程中使用更具表现力的方法(例如类型检查),看到Ramda库来完成这样的任务可能会很有趣 .
下一个代码只包含pure和pointfree函数:
从ES2017开始,
async
函数可用,因此我们也可以检查它们:然后将它们组合在一起:
当然,应该保护函数不受
null
和undefined
值的影响,所以要使其成为"safe":并且,完整的摘要总结:
但是,请注意,由于大量使用高阶函数,此解决方案可能会显示出比其他可用选项更低的性能 .
我认为您可以在Function原型上定义一个标志,并检查您要测试的实例是否继承了该标志
define a flag:
and then check if it exist
缺点是另一个原型可以定义相同的标志,然后它没有 Value ,但如果你完全控制包含的模块,这是最简单的方法
另一个简单的方法:
从节点v0.11开始,您可以使用标准的util函数:
@grandecomplex:你的解决方案有相当多的冗长 . 如果这样写的话会更清楚:
如果你使用Lodash,你可以使用_.isFunction .
如果value是函数,则此方法返回
true
,否则返回false
.尝试instanceof:似乎所有函数都继承自“Function”类:
确定下划线的方式更有效,但是当效率不是问题时,检查的最佳方法是在@Paul Rosania链接的下划线页面上编写 .
灵感来自下划线,最终的isFunction函数如下:
你应该在js中使用 typeOf operator .