【问题标题】:_.isFunction(a) vs. typeof a === 'function'? javascript_.isFunction(a) 与 typeof a === 'function'? javascript
【发布时间】:2013-06-11 01:57:10
【问题描述】:

我认为这可能只是性能案例 - http://jsperf.com/comparing-underscore-js-isfunction-with-typeof-function/2

而且似乎typeof 更快.. 所以我的问题是 - 哪个更适合使用?

【问题讨论】:

标签: javascript performance underscore.js typeof


【解决方案1】:

没有理由不使用typeof

不仅速度更快,而且ECMAScript specification 确保所有函数都具有“函数”类型,并且只有函数可以具有“函数”类型:

这个操作符是专门用来获取值的类型的,为什么不用它呢?

【讨论】:

  • @Kosmetika 我没有得到你的评论。
  • 我的意思是需要有一个点才能使用isFunction(),甚至可能是instanceof Function
  • @Kosmetika 正如 Dogbert 指出的那样,旧版 Chrome 中存在 一个错误。现在你应该使用typeof
  • 好吧。一切都很完美,这是正确的答案,但我认为使用 _.isFunction() 对于阅读源代码的新手来说更清晰。此外,在性能上也没有太大差异。
  • 什么是“主机”对象?
【解决方案2】:

首先,Underscore 不再使用该实现。它优化到typeof,除非typeof /./ 返回function,就像它至少在older versions of Chrome 中所做的那样

你可以在源代码中找到这个:http://underscorejs.org/underscore.js

// Optimize `isFunction` if appropriate.
  if (typeof (/./) !== 'function') {
    _.isFunction = function(obj) {
      return typeof obj === 'function';
    };
  }

新的 jsperf:http://jsperf.com/comparing-underscore-js-isfunction-with-typeof-function/3

它在 FF 中仍然显示出相当大的性能损失(但远低于您在问题中发布的幼稚实现),这是由于函数调用的开销与仅内联代码相比。

【讨论】:

  • 在 Mac OS X 10.8.3 上的 Chrome 27.0.1453.110 中测试 - typeof 以 54,472,323 ±1.45% 最快速度获胜
  • @Kosmetika,尝试将typeof 包装成一个简单的函数,它做同样的事情并进行比较。 :)
  • 但是为什么不直接使用typeof呢?
  • @Kosmetika,你看到我在第一句话中发布的链接了吗?为了与旧版 Google Chrome 兼容。
  • @Kosmetika 没有理由不使用 typeof。 Dogbert 在他有趣的回答中指出了一个不再有效的原因(除非您设法运行旧版本的 Chrome)。
猜你喜欢
  • 1970-01-01
  • 2021-09-17
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
相关资源
最近更新 更多