(typeof variable ===“function”)和jQuery.isFunction()之间有什么区别?
我一直使用(typeof variable === "function")
,我偶然发现了jQuery.isFunction()
,我想知道:
- typeof方法和jQuery的方法有什么区别? 而且不仅仅是差异,而是
- 什么时候使用typeof方法是合适的,什么时候适合使用jQuery的方法?
几乎没有区别,除了使用jQuery略慢。 查看源代码:
isFunction: function( obj ) { return jQuery.type(obj) === "function"; },
它调用一个调用另一个函数的函数来确定与你所展示的完全相同的东西:P
在这种情况下,jQuery实际上没有任何优势[或者以这种方式,90%的库用例]。 看看Vanilla-JS并查看它的一些function:P
TLDR:不要为此使用jQuery ……或任何东西。
UPDATE
这是一个基准测试,向您展示Vanilla JS比jQuery快约93%: http : //jsperf.com/jquery-isfunction-vs-vanilla-is-function 。
没有区别。 jQuery使用相同的概念:
// ... isFunction: function( obj ) { return jQuery.type(obj) === "function"; }
更新:
在深入挖掘后,我发现jQuery的isFunction
方法是将function() {}
上的Object.prototype
链的toString
方法与字符串[object Function]
。 这就是它与前一个例子的不同之处以及它比typeof
慢的原因。
isFunction的jQuery源代码是
isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ core_toString.call(obj) ] || "object"; }, //... jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); core_toString = Object.prototype.toString,
因此,当且仅当在其参数上调用Object.prototype.toString.call
返回[object Function]
Object.prototype.toString.call
才返回true。
通常,您可以使用此测试来测试JS对象是否是函数:
(typeof fn === 'function')
但是,这并不总是有效(IE8):
typeof alert => 'object' typeof document.createElement('input').getAttribute => 'object'
在jQuery 1.4内部之前,他们使用相同的检查,但现在他们已经修复了它。 因此,为了确保传递的对象是一个可以调用的函数,只需使用$ .isFunction方法:
$.isFunction(function() {}) => true $.isFunction(alert) => true $.isFunction(document.createElement('input').getAttribute) => true
复制自此博客: http : //nuald.blogspot.co.uk/2012/07/why-jqueryisfunction.html
区别在于JQuery调用与以下内容等效的东西并检查“Function”字符串标记:
var toString = Object.prototype.toString; var func = function(){}; console.log(toString.call(func)); // "returns [object Function]"
而typof,只返回“function”:
var fType = typeof func; console.log(fType); // returns "function"
这是一个例子。