假设我有一个变量,其定义如下:
var a = function() {/* Statements */};
我希望有一个函数可以检查变量的类型是否类似于函数。例如:
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
我如何检查变量 a
是否为上述定义的 Function
类型?
假设我有一个变量,其定义如下:
var a = function() {/* Statements */};
我希望有一个函数可以检查变量的类型是否类似于函数。例如:
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
我如何检查变量 a
是否为上述定义的 Function
类型?
if (typeof v === 'function') {
// do something
}
typeof Object
、typeof Date
和 typeof String
,它们也都返回 'function'
。请注意不要改变原文的意思,并且保证翻译易懂通顺。 - Dave Wardif (v instanceOf Function)
与if (typeof v === 'function')
的区别是什么? - mquandalleinstanceof
相比,唯一的区别在于如果你正在检查来自另一个文档(可能是 iframe)的函数,则 instanceof
将无法工作。性能有所不同。 - rvighneasyncfunctionToCheck
的异步函数,getType.toString.call(functionToCheck)==='[object AsyncFunction]'
,而typeof asyncfunctionToCheck === 'function'
。 - TDreama虽然underscore的方式更有效率,但当效率不是问题时,检查的最佳方式可以在@Paul Rosania链接的underscore页面上找到。
受underscore的启发,最终的isFunction函数如下:
function isFunction(functionToCheck) {
return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}
注意:这种解决方案不适用于异步函数、生成器或代理函数。请查看其他答案以获取更为实时的解决方案。
typeof(obj) === 'function'
显然是最快的;然而,在Firefox中,obj instanceof Function
是明显的赢家。 - Justin Warkentin有多种方法,我将对它们进行总结。
function foo(v) {if (v instanceof Function) {/* do something */} };
最高效的方式(无需字符串比较)并且更为优雅的解决方案——instanceof 运算符在浏览器中已经被支持了很长时间,所以不用担心——它能在 IE 6 中正常工作。
function foo(v) {if (typeof v === "function") {/* do something */} };
typeof
的缺点是容易出现无声失败,如果您有拼写错误(例如“finction”),那么if
语句将只返回false,并且直到代码的后面才会发现错误。
function isFunction(functionToCheck) {
var getType = {};
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}
这个方案与解决方案#1或#2相比没有任何优势,但可读性要差得多。改进版如下:
function isFunction(x) {
return Object.prototype.toString.call(x) == '[object Function]';
}
但仍然比解决方案#1缺乏语义。
top.Function !== Function
。为确保正确性,请使用第二个解决方案(在调试期间,任何对“function”的错误拼写都将得到纠正,希望如此)。 - MaxArtUnderscore.js 使用一个更加复杂但高效的测试:
_.isFunction = function(obj) {
return !!(obj && obj.constructor && obj.call && obj.apply);
};
编辑:更新的测试表明 typeof 可能更快,请查看 https://jsben.ch/B6h73
typeof == "function"
)- 似乎比Underscore的“快速”版本快得多。 - Joel Purratypeof obj == 'function' || false
。 - Emile Bergeron@grandecomplex:你的解决方案有很多冗余。如果按照以下方式编写,将会更清晰:
function isFunction(x) {
return Object.prototype.toString.call(x) == '[object Function]';
}
var f = async () => 5; Object.prototype.toString.call(f)
返回'[object AsyncFunction]'
。这并不是荒谬或突如其来的,但值得记住。 - undefined更具浏览器支持并包含异步函数的替代方案可能是:
const isFunction = value => value && (Object.prototype.toString.call(value) === "[object Function]" || "function" === typeof value || value instanceof Function);
然后像这样进行测试:
isFunction(isFunction); //true
isFunction(function(){}); //true
isFunction(()=> {}); //true
isFunction(()=> {return 1}); //true
isFunction(async function asyncFunction(){}); //true
isFunction(Array); //true
isFunction(Date); //true
isFunction(Object); //true
isFunction(Number); //true
isFunction(String); //true
isFunction(Symbol); //true
isFunction({}); //false
isFunction([]); //false
isFunction("function"); //false
isFunction(true); //false
isFunction(1); //false
isFunction("Alireza Dezfoolian"); //false
const foo = function() {};
if (typeof foo === 'function') {
console.log('is function')
}
(() => (typeof obj === 'function') && doSomething())
仍然是最快的选项。 - darcherinstanceof
运算符:似乎所有函数都继承自Function
类:// Test data
var f1 = function () { alert("test"); }
var o1 = { Name: "Object_1" };
F_est = function () { };
var o2 = new F_est();
// Results
alert(f1 instanceof Function); // true
alert(o1 instanceof Function); // false
alert(o2 instanceof Function); // false
var fn = function () {}
if (fn.constructor === Function) {
// true
} else {
// false
}
fn && fn.constructor === Function
这个怎么样? - Yaroslav Melnichuk
isES3Function
,可以检测传入的value
是否是在ES3中独有的函数类型,而isGenericFunction
则可以检测传入的value
是否是一个通用的(或者说不具体/非具体)函数,因此可以是一个传统的ES3函数或者一个非异步箭头函数。 - undefined