【问题标题】:How to test whether `fn` is a function(callable)?如何测试`fn`是否是一个函数(可调用)?
【发布时间】:2019-04-03 15:48:14
【问题描述】:

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]'
}

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

【问题讨论】:

  • “这两个函数”我只看到一个函数。另外为了提高可读性,请不要在标题中放一半的问题。
  • @DanFromGermany 两个是typeof fn === 'function'toStr.call(fn) === '[object Function]',另外,编辑了标题,谢谢
  • 我不知道这段代码应该做什么

标签: javascript


【解决方案1】:

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

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

【讨论】:

  • 那么只使用typeof fn === 'function'就够了吗?
  • 是的,这是最好的解决方案。
猜你喜欢
  • 2016-11-16
  • 2020-05-13
  • 1970-01-01
  • 2010-10-22
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多