Suponha que eu tenha qualquer variável, definida da seguinte maneira:
var a = function() {/* Statements */};
Eu quero uma função que verifica se o tipo da variável é semelhante a uma função. ou seja:
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
Como posso verificar se a variável a
é do tipo Function
da maneira definida acima?
javascript
Jesufer Vn
fonte
fonte
Respostas:
O caminho do sublinhado é mais eficiente, mas a melhor maneira de verificar, quando a eficiência não é um problema, está escrita na página do sublinhado vinculada por @Paul Rosania.
Inspirada no sublinhado, a função final isFunction é a seguinte:
fonte
isFunctionA
mostra uma diferença de implementação em comparação com os outros métodos.typeof(obj) === 'function'
parece ser o mais rápido de longe; no entanto, no Firefoxobj instanceof Function
é o vencedor claro.fonte
typeof Object
,typeof Date
etypeof String
que todo o retorno'function'
também.if (v instanceOf Function)
?instanceof
que não funcionará se você estiver verificando uma função que veio de outro documento (um iframe, talvez). O desempenho varia.asyncfunctionToCheck
,getType.toString.call(functionToCheck)==='[object AsyncFunction]'
onde comotypeof asyncfunctionToCheck === 'function'
O Underscore.js usa um teste mais elaborado, mas de alto desempenho:
Consulte: http://jsperf.com/alternative-isfunction-implementations
EDIT: testes atualizados sugerem que o typeof pode ser mais rápido, consulte http://jsperf.com/alternative-isfunction-implementations/4
fonte
typof
?typeof == "function"
) - e parece ser muito mais rápido que a versão "rápida" do Underscore.isFunction()
implementações alternativas . Atualmente, usa algo muito próximo ao sugerido pelo dandeano .Existem várias maneiras, então vou resumir todas elas
typeof
é que ele é suscetível a falhas silenciosas, ruim; portanto, se você tiver um erro de digitação (por exemplo, "fusion") - nesse caso, o `if` retornará falso e você não saberá que há um erro até mais tarde. seu códigofonte
top.Function !== Function
. Para ter certeza, use o segundo (qualquer erro ortográfico de "função" seria corrigido durante a depuração, espero).instanceof
não leva em consideração várias globais, como uma verificação entre quadros, e pode retornar falsos negativos.jQuery (descontinuado desde a versão 3.3) Referência
Referência do AngularJS
Referência Lodash
Referência de sublinhado
Node.js descontinuado desde a v4.0.0 Referência
fonte
@grandecomplex: Há uma quantidade razoável de verbosidade na sua solução. Seria muito mais claro se escrito assim:
fonte
fonte
(() => (typeof obj === 'function') && doSomething())
ainda é a opção mais rápida.Experimente o
instanceof
operador: parece que todas as funções herdam daFunction
classe:fonte
Algo com mais suporte ao navegador e também inclui funções assíncronas pode ser:
e depois teste como:
fonte
Uma outra maneira simples:
fonte
fn && fn.constructor === Function
que tal agora?Para quem está interessado em estilo funcional ou procura uma abordagem mais expressiva para utilizar em metaprogramação (como verificação de tipo), pode ser interessante ver a biblioteca Ramda para realizar essa tarefa.
O código seguinte contém apenas funções puras e sem ponto:
No ES2017, as
async
funções estão disponíveis, para que possamos verificar também:E depois combine-os:
Obviamente, a função deve ser protegida contra
null
eundefined
valores, para torná-la "segura":E, complete o snippet para resumir:
No entanto, observe que esta solução pode mostrar menos desempenho do que outras opções disponíveis devido ao uso extensivo de funções de ordem superior.
fonte
Se você usa o Lodash, pode fazê-lo com _.isFunction .
Este método retorna
true
se value for uma função, caso contráriofalse
.fonte
Descobri que ao testar funções do navegador nativo no IE8, usando
toString
,instanceof
etypeof
não funcionou. Aqui está um método que funciona bem no IE8 (tanto quanto eu sei):Como alternativa, você pode verificar as funções nativas usando:
No entanto, li em algum lugar que isso nem sempre funcionará no IE7 e abaixo.
fonte
O abaixo parece funcionar para mim também (testado a partir de
node.js
):fonte
Eu acho que você pode apenas definir um sinalizador no protótipo Function e verificar se a instância que você deseja testar herdou esse
defina uma bandeira:
e depois verifique se existe
A desvantagem é que outro protótipo pode definir o mesmo sinalizador e, em seguida, é inútil, mas se você tiver controle total sobre os módulos incluídos, é a maneira mais fácil
fonte
Desde o nó v0.11, você pode usar a função util padrão:
fonte
você deve usar o
typeOf
operador em js.fonte
A solução, como algumas respostas anteriores mostraram, é usar typeof. a seguir está um trecho de código Nos NodeJs,
fonte