Angenommen, ich habe eine Variable, die wie folgt definiert ist:
var a = function() {/* Statements */};
Ich möchte eine Funktion, die prüft, ob der Typ der Variablen funktionsähnlich ist. dh:
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
Wie kann ich auf die oben definierte Weise überprüfen, ob die Variable a
vom Typ ist Function
?
javascript
Jesufer Vn
quelle
quelle
Antworten:
Sicher, der Weg des Unterstrichs ist effizienter, aber der beste Weg, um zu überprüfen, ob Effizienz kein Problem ist, ist auf der von @Paul Rosania verlinkten Seite des Unterstrichs zu finden.
Inspiriert vom Unterstrich lautet die endgültige isFunction-Funktion wie folgt:
quelle
isFunctionA
zeigt einen Implementierungsunterschied zu den anderen Methoden.typeof(obj) === 'function'
scheint es bei weitem das schnellste zu sein; In Firefoxobj instanceof Function
ist jedoch der klare Gewinner.quelle
typeof Object
,typeof Date
, undtypeof String
, die alle Rückkehr'function'
zu.if (v instanceOf Function)
?instanceof
funktioniert nicht, wenn Sie eine Funktion überprüfen, die aus einem anderen Dokument stammt (möglicherweise einem Iframe). Die Leistung variiert.asyncfunctionToCheck
,getType.toString.call(functionToCheck)==='[object AsyncFunction]'
wo alstypeof asyncfunctionToCheck === 'function'
Underscore.js verwendet einen aufwändigeren, aber hochleistungsfähigen Test:
Siehe: http://jsperf.com/alternative-isfunction-implementations
BEARBEITEN: Aktualisierte Tests deuten darauf hin, dass der Typ möglicherweise schneller ist (siehe http://jsperf.com/alternative-isfunction-implementations/4)
quelle
typof
?typeof == "function"
) - und es scheint viel schneller zu sein als die "schnelle" Version von Underscore.isFunction()
Implementierungen befindet. Derzeit wird etwas verwendet, das dem sehr nahe kommt, was Dandean vorgeschlagen hat.Es gibt verschiedene Möglichkeiten, also werde ich sie alle zusammenfassen
typeof
ist, dass es anfällig für stille Fehler ist, schlecht, wenn Sie also einen Tippfehler haben (z. B. "Finction") - in diesem Fall gibt das "if" nur false zurück und Sie werden erst später wissen, dass Sie einen Fehler haben dein Codequelle
top.Function !== Function
. Verwenden Sie zur Sicherheit die zweite (hoffentlich wird jede Rechtschreibfehler von "function" beim Debuggen korrigiert).instanceof
berücksichtigt Ihre „beste“ Lösung, die Sie verwenden , nicht mehrere globale Werte, z. B. eine Prüfung über Frames hinweg, und kann falsch negative Ergebnisse zurückgeben.jQuery (veraltet seit Version 3.3) Referenz
AngularJS Referenz
Lodash Referenz
Unterstreichende Referenz
Node.js ist seit der Referenz v4.0.0 veraltet
quelle
@grandecomplex: Ihre Lösung ist ziemlich ausführlich. Es wäre viel klarer, wenn man so schreiben würde:
quelle
quelle
(() => (typeof obj === 'function') && doSomething())
ist immer noch die schnellste Option.Versuchen Sie den
instanceof
Operator: Es scheint, dass alle Funktionen von derFunction
Klasse erben :quelle
Etwas mit mehr Browserunterstützung und auch asynchronen Funktionen könnte sein:
und dann testen Sie es wie:
quelle
Ein anderer einfacher Weg:
quelle
fn && fn.constructor === Function
Wie wäre es damit?Für diejenigen, die sich für funktionalen Stil interessieren oder nach einem ausdrucksstärkeren Ansatz für die Metaprogrammierung suchen (z. B. Typprüfung), könnte es interessant sein, Ramda zu sehen Bibliothek zu sehen, um eine solche Aufgabe zu erfüllen.
Der nächste Code enthält nur reine und punktfreie Funktionen:
Ab ES2017 sind
async
Funktionen verfügbar, sodass wir sie auch überprüfen können:Und dann kombinieren Sie sie zusammen:
Natürlich sollte die Funktion gegen
null
undundefined
Werte geschützt werden, um sie "sicher" zu machen:Und ein vollständiger Ausschnitt, um es zusammenzufassen:
Beachten Sie jedoch, dass diese Lösung aufgrund der umfangreichen Verwendung von Funktionen höherer Ordnung möglicherweise eine geringere Leistung als andere verfügbare Optionen aufweist.
quelle
Wenn Sie Lodash verwenden, können Sie dies mit _.isFunction tun .
Diese Methode gibt zurück,
true
wenn value eine Funktion istfalse
.quelle
Ich fand , dass bei der Prüfung von nativen Browser - Funktionen in IE8, mit
toString
,instanceof
undtypeof
habe nicht funktioniert. Hier ist eine Methode, die in IE8 gut funktioniert (soweit ich weiß):Alternativ können Sie nach nativen Funktionen suchen, indem Sie:
Allerdings habe ich irgendwo gelesen, dass dies in IE7 und darunter nicht immer funktioniert.
quelle
Das Folgende scheint auch für mich zu funktionieren (getestet von
node.js
):quelle
Ich denke, Sie können einfach ein Flag für den Funktionsprototyp definieren und prüfen, ob die zu testende Instanz dies geerbt hat
Flag definieren:
und überprüfen Sie dann, ob es existiert
Der Nachteil ist, dass ein anderer Prototyp das gleiche Flag definieren kann und es dann wertlos ist. Wenn Sie jedoch die volle Kontrolle über die enthaltenen Module haben, ist dies der einfachste Weg
quelle
Seit Knoten v0.11 können Sie die Standard-Util-Funktion verwenden:
quelle
Sie sollten den
typeOf
Operator in js verwenden.quelle
Wie einige frühere Antworten gezeigt haben, besteht die Lösung darin, typeof zu verwenden. Das Folgende ist ein Code-Snippet in NodeJs,
quelle