我已经做了相当多的研究到这一点,但它似乎使用的方法是不一致和多种多样的。

这里有一些方法,我已在过去使用:

/* 1: */  typeof myFunc === 'function'
/* 2: */  myFunc.constructor === Function
/* 3: */  myFunc instanceof Function

作为我的一部分的研究,我有看一些众所周知的图书馆完成了这个:

 /* jQuery 1.2.6: */  !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /^[\s[]?function/.test( fn + "" )
 /* jQuery 1.3b1: */  toString.call(obj) === "[object Function]"
/* Prototype 1.6: */  typeof object == "function"
      /* YUI 2.6: */  typeof o === 'function'

我很惊讶有这么多不同的方法类使用,肯定一个可接受的测试已经商定?和我完全无能以什么样的意图是有文1.2.6的表演,看起来有点OTT...

因此,我的问题是,什么是最好的*样的测试?

我还赞赏一些深入了解上述的一些方法,尤其是jQuery1.2.6。(我可以看到他们在做什么,它只是好奇)

[*]通过"最好",我的意思是最广泛接受的跨浏览器兼容的方法。


编辑:是的,我知道它已经讨论过,但我还是想一些讨论的最有效方法。为什么有这么多不同使用方法?

讨论以迄今为止仅提到的类型的操作者(大部分),但没有人已经暗示在本效益的替代方法。

有帮助吗?

解决方案

最好的方法来测试,如果对象是一个功能 typeof myFunc === 'function'.如果您使用的图书馆、使用图书馆的功能测试: jQuery.isFunction(myFunc).

事情 可以 被误报为职能的时候使用 typeof.这是非常罕见,但库存中删除这些不一致之处。jQuery的工作围绕这些问题:

  • Firefox报告功能 typeof document.createElement("object")
  • Safari报告功能 typeof document.body.childNodes
  • 旧版本的火狐报告经常表现为功能(这一情况不在3.0).
  • 一些即建立全球职能(alert)和一些节点的方法(getAttribute)是据报道类型的"对象"。

使用 instanceof 而不是 typeof 绕开其中的一些。例如, document.createElement("object") instanceof Functionfalse 在Firefox。

你可以查看的出生的第一种方法的意见 原始票(#3618).新的方法是从 集5947 似乎已经发明了Resig解决 即存储器泄漏.它可能较慢,但是较小的和更清洁。

没有多少差别==并===这方面的事物如何运作,但严格的评估是以往略更快,因此优先。

其他提示

jQuery开发人员John Resig似乎确实在jQuery的内部做了一些奇怪的选择。

toString.call(obj) === "[object Function]"

看起来非常整洁,但我想不出任何情况,如果简单的 typeof 方法失败,上面的情况会是正确的,但也许他知道剩下的用法没有。

typeof o === "function"

我会选择后者,因为它更清晰,除非你有充分的证据表明它不会起作用。

为什么在 typeof 上使用严格相等,因为两个操作数都是字符串?我忽略了一些问题?

无论如何,我会采用更简单的typeof方式,这似乎就是为此而且可读。 instanceof 也是可读的,但它似乎更多地坚持一个函数是一个对象的事实,这可能与问题无关。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top