Supongamos que tengo alguna variable, que se define de la siguiente manera:
var a = function() {/* Statements */};
Quiero una función que verifique si el tipo de la variable es similar a una función. es decir:
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
¿Cómo puedo verificar si la variable a
es de tipo Function
en la forma definida anteriormente?
javascript
Jesufer Vn
fuente
fuente
Respuestas:
Claro que la forma de subrayar es más eficiente, pero la mejor manera de verificar, cuando la eficiencia no es un problema, está escrita en la página de subrayado vinculada por @Paul Rosania.
Inspirada en el subrayado, la función final isFunction es la siguiente:
fuente
isFunctionA
muestra una diferencia de implementación en comparación con los otros métodos.typeof(obj) === 'function'
parece ser el más rápido con diferencia; Sin embargo, en Firefoxobj instanceof Function
es el claro ganador.fuente
typeof Object
,typeof Date
ytypeof String
que todos vuelven'function'
demasiado.if (v instanceOf Function)
?instanceof
que no funcionará si está verificando una función que proviene de otro documento (un iframe, tal vez). El rendimiento varía.asyncfunctionToCheck
,getType.toString.call(functionToCheck)==='[object AsyncFunction]'
donde comotypeof asyncfunctionToCheck === 'function'
Underscore.js utiliza una prueba más elaborada pero de alto rendimiento:
Ver: http://jsperf.com/alternative-isfunction-implementations
EDITAR: las pruebas actualizadas sugieren que typeof podría ser más rápido, consulte http://jsperf.com/alternative-isfunction-implementations/4
fuente
typof
?typeof == "function"
), y parece ser mucho más rápido que la versión "rápida" de Underscore.isFunction()
implementaciones alternativas . Actualmente usa algo muy cercano a lo que sugirió dandean .Hay varias formas, así que las resumiré todas
typeof
es que es susceptible a fallas silenciosas, mal, así que si tiene un error tipográfico (por ejemplo, "finction"), en este caso, el `if` simplemente devolverá falso y no sabrá que tiene un error hasta más tarde tu codigofuente
top.Function !== Function
. Para estar seguro, use el segundo (con suerte, cualquier error ortográfico de la "función" se corregirá durante la depuración).instanceof
no tiene en cuenta múltiples globales, como un cheque a través de cuadros, y puede devolver falsos negativos.jQuery (en desuso desde la versión 3.3) Referencia
AngularJS Referencia de
Lodash Referencia de
Guion bajo Referencia de
Node.js en desuso desde v4.0.0 Referencia
fuente
@grandecomplex: Hay una buena cantidad de verbosidad en su solución. Sería mucho más claro si se escribiera así:
fuente
fuente
(() => (typeof obj === 'function') && doSomething())
sigue siendo la opción más rápida.Pruebe el
instanceof
operador: parece que todas las funciones heredan de laFunction
clase:fuente
Algo con más compatibilidad con el navegador y también incluye funciones asíncronas podría ser:
y luego probarlo como:
fuente
Otra forma sencilla:
fuente
fn && fn.constructor === Function
¿Qué tal esto?Para aquellos que están interesados en el estilo funcional, o buscan un enfoque más expresivo para utilizar en la meta programación (como la verificación de tipos), podría ser interesante ver a Ramda biblioteca para realizar dicha tarea.
El siguiente código contiene solo funciones puras y sin puntos:
A partir de ES2017, las
async
funciones están disponibles, por lo que también podemos verificarlas:Y luego combinarlos juntos:
Por supuesto, la función debe protegerse contra
null
y losundefined
valores, para que sea "segura":Y, fragmento completo para resumir:
Sin embargo, tenga en cuenta que esta solución podría mostrar menos rendimiento que otras opciones disponibles debido al uso extensivo de funciones de orden superior.
fuente
Si usa Lodash, puede hacerlo con _.isFunction .
Este método devuelve
true
si el valor es una función, de lo contrariofalse
.fuente
He descubierto que al probar las funciones del navegador nativo en IE8, usando
toString
,instanceof
ytypeof
no funcionó. Aquí hay un método que funciona bien en IE8 (que yo sepa):Alternativamente, puede verificar las funciones nativas usando:
Sin embargo, he leído en alguna parte que esto no siempre funcionará en IE7 y versiones inferiores.
fuente
Lo siguiente parece funcionar para mí también (probado desde
node.js
):fuente
Creo que puede definir un indicador en el prototipo de Función y verificar si la instancia que desea probar heredó eso
definir una bandera:
y luego verifica si existe
La desventaja es que otro prototipo puede definir la misma bandera y luego no vale nada, pero si tiene control total sobre los módulos incluidos, es la forma más fácil
fuente
Desde el nodo v0.11 puede usar la función de utilidad estándar:
fuente
deberías usar
typeOf
operator en js.fuente
La solución, como han mostrado algunas respuestas anteriores, es usar typeof. el siguiente es un fragmento de código en NodeJs,
fuente