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



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

我在 mdn 上看到了isCallable的功能(请参阅第 4 行 - 第 7 行(:

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

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

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

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

最新更新