javascript - 如何测试`fn`是否是一个函数(可调用)?
问题描述
在什么情况下会Object.prototype.toString.call(fn) === '[object Function]'
返回typeof fn === 'function'
不同的结果?
我isCallable
在 mdn 上看到了这个函数(见第 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)。
推荐阅读
- java - 即使在 Ubuntu 中安装后 Java 也无法运行
- azure - 将 Azure API for FHIR 数据复制到 datalake
- c++ - 从类方法调用朋友函数
- nginx - 启用 ssl 时,nginx 不再重写重定向位置
- python - 测试目录中的 Python 导入
- html - 我想在点击时使用 javascript 或 jquery 将动画播放状态更改为运行。任何帮助都会得到帮助
- javascript - 如何尽快运行 JavaScript 函数?
- python - 我如何抓取 Aliexpress 产品数据
- flutter - dart中等效的String.format java方法
- sql - 存在时的SQL查询案例添加多个