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

时间:2019-04-03 15:48:15

标签: javascript

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

我在mdn上看到了功能isCallable(请参阅line 4 - line 7):

var isCallable = function (fn) {
    var toStr = Object.prototype.toString
    return typeof fn === 'function' || toStr.call(fn) === '[object Function]'
}

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

1 个答案:

答案 0 :(得分:2)

Object.prototype.toString返回对象内部[[Class]]属性的值,它实际上不是Type。
此内部属性的值表示对象的规范定义的分类(更多信息here)。
宿主对象的[[Class]]内部属性的值-作为DOM元素-可以是任何值,它完全取决于实现。

因此,测试fn是否为函数的最佳方法是使用typeof fn
不仅速度更快,而且ECMAScript规范可确保所有功能都具有“功能”类型,并且只有功能可以具有“功能”类型(另请参见https://stackoverflow.com/a/17108198/709439)。