题
我已经做了相当多的研究到这一点,但它似乎使用的方法是不一致和多种多样的。
这里有一些方法,我已在过去使用:
/* 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 Function
是 false
在Firefox。
你可以查看的出生的第一种方法的意见 原始票(#3618).新的方法是从 集5947 似乎已经发明了Resig解决 即存储器泄漏.它可能较慢,但是较小的和更清洁。
没有多少差别==并===这方面的事物如何运作,但严格的评估是以往略更快,因此优先。
其他提示
jQuery开发人员John Resig似乎确实在jQuery的内部做了一些奇怪的选择。
toString.call(obj) === "[object Function]"
看起来非常整洁,但我想不出任何情况,如果简单的 typeof
方法失败,上面的情况会是正确的,但也许他知道剩下的用法没有。
typeof o === "function"
我会选择后者,因为它更清晰,除非你有充分的证据表明它不会起作用。
为什么在 typeof
上使用严格相等,因为两个操作数都是字符串?我忽略了一些问题?
无论如何,我会采用更简单的typeof方式,这似乎就是为此而且可读。 instanceof
也是可读的,但它似乎更多地坚持一个函数是一个对象的事实,这可能与问题无关。