.isFunction(a) vs typeof = = = "function"? JavaScript

je pense qu'il pourrait être la performance du cas - http://jsperf.com/comparing-underscore-js-isfunction-with-typeof-function/2

Et il semble que typeof est plus rapide.. donc ma question est - ce qui est le plus approprié à utiliser?

42
demandé sur Kosmetika 2013-06-14 16:06:17

2 réponses

Il n'y a aucune raison de ne pas utiliser typeof.

non seulement il est plus rapide, mais le spécification ECMAScript assure que toutes les fonctions ont un type de "fonction" et que seul les fonctions peuvent avoir un type "fonction" :

enter image description here

Cet opérateur a été spécialement conçu pour obtenir le type d'une valeur, alors pourquoi ne pas l'utiliser ?

90
répondu Denys Séguret 2013-06-14 12:17:48

tout d'abord, Underscore n'utilise plus cette implémentation. Il optimise typeof à moins que typeof /./ retourne function, comme il l'a fait au moins versions plus anciennes de Chrome

Vous pouvez trouver dans le code source: http://underscorejs.org/underscore.js

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

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

Il montre encore tout à fait un gain de performance dans les FF (mais Beaucoup moins que l'implémentation naïve que vous avez postée dans la question), ce qui est dû à la surcharge d'un appel de fonction vs seulement du code inlining.

12
répondu Dogbert 2017-05-23 10:31:19