8

我一直使用(typeof variable === "function"),我偶然发现jQuery.isFunction(),我想知道:

  1. typeof方法和jQuery的方法有什么区别?不仅有什么区别,而且
  2. 什么时候适合使用 typeof 方法,什么时候适合使用 jQuery 的方法?
4

5 回答 5

11

几乎没有区别,除了使用 jQuery 稍微慢一些。查看源代码:

isFunction: function( obj ) {
    return jQuery.type(obj) === "function";
},

它调用一个函数,该函数调用另一个函数来确定与您显示的完全相同的事情:P

在这种情况下,jQuery 确实没有任何优势 [或者对于这种方式,库的 90% 的用例]。查看Vanilla-JS并查看它的一些功能:P

TLDR:不要为此使用 jQuery ......或任何东西。

更新

这是一个基准,显示 Vanilla JS 比 jQuery 快大约 93%:http: //jsperf.com/jquery-isfunction-vs-vanilla-is-function

于 2012-08-30T21:55:05.577 回答
4

没有区别。jQuery 使用相同的概念:

// ...
isFunction: function( obj ) {
    return jQuery.type(obj) === "function";
}

更新:

在深入挖掘之后,我发现 jQuery 的isFunction方法是将链上的toString方法与字符串进行比较。这就是它与您之前的示例的不同之处以及它比.Object.prototypefunction() {}[object Function]typeof

于 2012-08-30T21:53:33.943 回答
2

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,

因此jQuery.isFunction当且仅当调用Object.prototype.toString.call它的参数返回true [object Function]

于 2012-08-30T22:01:31.437 回答
2

通常你可以通过这个测试来测试 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

于 2014-07-25T08:35:32.203 回答
1

不同之处在于 JQuery 调用与以下内容等效的内容并检查“Function”字符串标记:

var toString = Object.prototype.toString;
var func = function(){};

console.log(toString.call(func)); // "returns [object Function]"

而typof,只返回“函数”:

var fType = typeof func; 

console.log(fType); // returns "function"

这是一个例子。

于 2012-08-30T22:03:46.913 回答