web-dev-qa-db-ja.com

_.isFunction(a)vs. typeof a === 'function'? javascript

私はそれが唯一のパフォーマンスケースかもしれないと思う- http://jsperf.com/comparing-underscore-js-isfunction-with-typeof-function/2

typeofの方が速いようです。私の質問は-どちらを使用するのが適切ですか?

48
Kosmetika

typeofを使用しない理由はありません。

より高速であるだけでなく、 ECMAScript仕様 により、すべての関数が「関数」のタイプを持ち、関数のみが「関数」のタイプを持つことができます。

enter image description here

この演算子は、値の型を取得するために特別に設計されたので、使用しないのはなぜですか?

96
Denys Séguret

まず、Underscoreはその実装を使用しなくなりました。 Chromeの古いバージョン で行われたように、typeof /./typeofを返さない限り、functionに最適化されます。

ソースコードでこれを見つけることができます: 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/

FFでのパフォーマンスヒットはかなりあります(ただし、質問で投稿した素朴な実装よりもはるかに少ない)。これは、関数呼び出しとインライン化コードのオーバーヘッドによるものです。

13
Dogbert