Javascript 如何测试'fn'是否是一个函数(可调用)?

Javascript 如何测试'fn'是否是一个函数(可调用)?,javascript,Javascript,在哪种情况下,Object.prototype.toString.call(fn)==='[Object Function]'和typeof fn===='Function'会返回不同的结果 我在mdn上看到了函数isCallable(请参阅): 我想知道这两个测试之间的区别,其中一个是多余的吗?Object.prototype.toString返回对象的内部[[Class]]属性的值,它实际上不是一个类型。 此内部属性的值表示由规范定义的对象分类(详细信息)。 主机对象的[[Class]]内部

在哪种情况下,
Object.prototype.toString.call(fn)==='[Object Function]'
typeof fn===='Function'
会返回不同的结果

我在mdn上看到了函数
isCallable
(请参阅):


我想知道这两个测试之间的区别,其中一个是多余的吗?

Object.prototype.toString
返回对象的内部[[Class]]属性的值,它实际上不是一个类型。
此内部属性的值表示由规范定义的对象分类(详细信息)。
主机对象的[[Class]]内部属性的值(作为DOM元素)可以是任何值,它完全依赖于实现

因此,测试
fn
是否为函数的最佳方法是使用
typeof fn


不仅速度更快,而且ECMAScript规范确保所有函数都具有“函数”类型,并且只有函数才能具有“函数”类型(另请参见)。

可能重复的“这两个函数”我只看到一个函数。同样为了提高可读性,请不要在标题中加入一半的问题。@Danfrom Germany这两个是
typeof fn===“function”
toStr.call(fn)==“object function]”
,另外,编辑了标题,谢谢。我不知道这段代码应该做什么。仅仅使用
typeof fn==“function”
,够了吗,这是最好的解决办法。
var isCallable = function (fn) {
    var toStr = Object.prototype.toString
    return typeof fn === 'function' || toStr.call(fn) === '[object Function]'
}