Supposons que j'ai une variable, qui est définie comme suit:
var a = function() {/* Statements */};
Je veux une fonction qui vérifie si le type de la variable ressemble à une fonction. c'est à dire :
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
Comment puis-je vérifier si la variable a
est de type Function
de la manière définie ci-dessus?
javascript
Jesufer Vn
la source
la source
Réponses:
Bien sûr, la méthode de soulignement est plus efficace, mais la meilleure façon de vérifier, lorsque l'efficacité n'est pas un problème, est écrite sur la page de soulignement liée par @Paul Rosania.
Inspirée par le soulignement, la fonction finale isFunction est la suivante:
la source
isFunctionA
montre une différence d'implémentation par rapport aux autres méthodes.typeof(obj) === 'function'
semble que ce soit de loin le plus rapide; cependant, dans Firefoxobj instanceof Function
est le vainqueur clair.la source
typeof Object
,typeof Date
ettypeof String
qui tout retour'function'
aussi.if (v instanceOf Function)
?instanceof
cela ne fonctionnera pas si vous vérifiez une fonction provenant d'un autre document (un iframe, peut-être). Les performances varient.asyncfunctionToCheck
,getType.toString.call(functionToCheck)==='[object AsyncFunction]'
où commetypeof asyncfunctionToCheck === 'function'
Underscore.js utilise un test plus élaboré mais très performant:
Voir: http://jsperf.com/alternative-isfunction-implementations
EDIT: des tests mis à jour suggèrent que typeof pourrait être plus rapide, voir http://jsperf.com/alternative-isfunction-implementations/4
la source
typof
?typeof == "function"
) - et elle semble être beaucoup plus rapide que la version "rapide" d'Underscore.isFunction()
implémentations alternatives . Il utilise actuellement quelque chose de très proche de ce que le dandin a suggéré.Il y a plusieurs façons donc je vais les résumer toutes
typeof
est qu'il est susceptible d'échec silencieux, mauvais, donc si vous avez une faute de frappe (par exemple "finction") - dans ce cas, le "if" retournera juste faux et vous ne saurez que vous avez une erreur que plus tard dans votre codela source
top.Function !== Function
. Pour être sûr, utilisez le second (toute faute d'orthographe de "fonction" sera corrigée lors du débogage, espérons-le).instanceof
ne prend pas en compte plusieurs globaux, comme une vérification sur plusieurs cadres, et peut renvoyer des faux négatifs.jQuery (obsolète depuis la version 3.3) Référence
Référence AngularJS
Référence Lodash
Référence de soulignement
Node.js déconseillé depuis la référence v4.0.0
la source
@grandecomplex: Votre solution est assez verbeuse. Ce serait beaucoup plus clair s'il était écrit comme ceci:
la source
la source
(() => (typeof obj === 'function') && doSomething())
reste l'option la plus rapide.Essayez l'
instanceof
opérateur: il semble que toutes les fonctions héritent de laFunction
classe:la source
Quelque chose avec plus de support du navigateur et qui inclut également des fonctions asynchrones pourrait être:
puis testez-le comme:
la source
Une autre manière simple:
la source
fn && fn.constructor === Function
que dis-tu de ça?Pour ceux qui s'intéressent au style fonctionnel ou qui recherchent une approche plus expressive à utiliser dans la méta-programmation (comme la vérification de type), il pourrait être intéressant de voir la bibliothèque Ramda pour accomplir une telle tâche.
Le code suivant ne contient que des fonctions pures et sans point:
Depuis ES2017, des
async
fonctions sont disponibles, nous pouvons donc également les vérifier:Et puis combinez-les ensemble:
Bien sûr, la fonction doit être protégé contre
null
etundefined
valeurs, afin de le rendre « sûr »:Et, un extrait complet pour résumer:
Cependant, notez que cette solution pourrait afficher moins de performances que les autres options disponibles en raison de l'utilisation intensive de fonctions d'ordre supérieur.
la source
Si vous utilisez Lodash, vous pouvez le faire avec _.isFunction .
Cette méthode retourne
true
si value est une fonction, sinonfalse
.la source
J'ai trouvé que lors du test des fonctions de navigateur natif dans IE8, en utilisant
toString
,instanceof
ettypeof
ne fonctionne pas. Voici une méthode qui fonctionne bien dans IE8 (pour autant que je sache):Alternativement, vous pouvez vérifier les fonctions natives en utilisant:
Cependant, j'ai lu quelque part que cela ne fonctionnera pas toujours dans IE7 et ci-dessous.
la source
Ce qui suit semble également fonctionner pour moi (testé depuis
node.js
):la source
Je pense que vous pouvez simplement définir un indicateur sur le prototype de fonction et vérifier si l'instance que vous souhaitez tester a hérité de celle
définir un drapeau:
puis vérifiez s'il existe
L'inconvénient est qu'un autre prototype peut définir le même drapeau et que cela ne vaut rien, mais si vous avez un contrôle total sur les modules inclus, c'est le moyen le plus simple
la source
Depuis le noeud v0.11, vous pouvez utiliser la fonction util standard:
la source
vous devez utiliser l'
typeOf
opérateur dans js.la source
La solution, comme certaines réponses précédentes l'ont montré, consiste à utiliser typeof. ce qui suit est un extrait de code dans NodeJs,
la source