it-swarm.com.de

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

Ich denke, es könnte nur ein Leistungsfall sein - http://jsperf.com/comparing-underscore-js-isfunction-with-typeof-function/2

Und scheint, dass typeof schneller ist. Meine Frage lautet also - welche ist besser geeignet?

48
Kosmetika

Es gibt keinen Grund, typeof nicht zu verwenden.

Es ist nicht nur schneller, sondern die ECMAScript-Spezifikation stellt sicher, dass alle Funktionen eine Art "Funktion" haben und dass nur Funktionen eine Art "Funktion" haben können:

enter image description here

Dieser Operator wurde speziell entwickelt, um den Typ eines Werts abzurufen. Warum sollte er nicht verwendet werden?

96
Denys Séguret

Erstens verwendet Underscore diese Implementierung nicht mehr. Es wird auf typeof optimiert, sofern typeof /./ gibt function zurück, wie es zumindest in älteren Versionen von Chrome der Fall war

Sie finden dies im Quellcode: http://underscorejs.org/underscore.js

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

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

Es zeigt immer noch einen ziemlichen Leistungseinbruch in FF (aber VIEL weniger als die naive Implementierung, die Sie in der Frage gepostet haben), was auf den Overhead eines Funktionsaufrufs im Vergleich zu einfachem Inlining-Code zurückzuführen ist.

13
Dogbert