Предположим, у меня есть любая переменная, которая определяется следующим образом:
var a = function() {/* Statements */};
Я хочу функцию, которая проверяет, является ли тип переменной как функция. т.е.
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
Как я могу проверить, имеет ли переменная a
тип Function
описанным выше способом?
javascript
Иезуфер Вн
источник
источник
Ответы:
Конечно, способ подчеркивания более эффективен, но лучший способ проверить, когда эффективность не является проблемой, написан на странице подчеркивания, на которую ссылается @Paul Rosania.
Вдохновленная подчеркиванием, заключительная функция isFunction выглядит следующим образом:
источник
isFunctionA
показывает разницу в реализации по сравнению с другими методами.typeof(obj) === 'function'
похоже, самый быстрый на сегодняшний день; однако в Firefoxobj instanceof Function
явный победитель.источник
typeof Object
, иtypeof Date
, иtypeof String
все'function'
тоже возвращаются .if (v instanceOf Function)
?instanceof
что не сработает, если вы проверяете функцию, пришедшую из другого документа (возможно, iframe) Производительность варьируется.asyncfunctionToCheck
,getType.toString.call(functionToCheck)==='[object AsyncFunction]'
где, какtypeof asyncfunctionToCheck === 'function'
Underscore.js использует более сложный, но высокопроизводительный тест:
Смотрите: http://jsperf.com/alternative-isfunction-implementations
РЕДАКТИРОВАТЬ: обновленные тесты показывают, что typeof может быть быстрее, см. Http://jsperf.com/alternative-isfunction-implementations/4
источник
typof
?typeof == "function"
), и, похоже, она работает намного быстрее, чем «быстрая» версия Underscore.isFunction()
реализаций. В настоящее время он использует что-то очень близкое к тому, что предложил Дандеан .Есть несколько способов, поэтому я обобщу их все
typeof
является то, что он подвержен тихому отказу, что плохо, поэтому, если у вас есть опечатка (например, «finction») - в этом случае `if` просто вернет false, и вы не будете знать, что у вас будет ошибка, пока позже в ваш кодисточник
top.Function !== Function
. Чтобы быть уверенным, используйте второй (любая ошибка написания «функции» будет исправлена во время отладки, мы надеемся).instanceof
, не учитывает множественные глобальные переменные, такие как проверка по кадрам, и может возвращать ложные отрицания.JQuery ( не рекомендуется начиная с версии 3.3) Reference
AngularJS Ссылка
Lodash Ссылка
Подчеркнуть Ссылка
Node.js устаревшим с V4.0.0 Reference
источник
@grandecomplex: в вашем решении довольно много подробностей. Было бы намного понятнее, если бы написано так:
источник
источник
(() => (typeof obj === 'function') && doSomething())
все еще самый быстрый вариант.Попробуйте
instanceof
оператор: кажется, что все функции наследуются отFunction
класса:источник
Что-то с большей поддержкой браузера, а также с асинхронными функциями может быть:
а затем проверить это как:
источник
Другой простой способ:
источник
fn && fn.constructor === Function
как насчет этого?Для тех, кто интересуется функциональным стилем или ищет более выразительный подход для использования в метапрограммировании (например, проверку типов), было бы интересно увидеть библиотеку Ramda для выполнения такой задачи.
Следующий код содержит только чистые и точечные функции:
Начиная с ES2017,
async
функции доступны, поэтому мы также можем проверить их:А затем объединить их вместе:
Конечно, функция должна быть защищена от
null
иundefined
значений, чтобы сделать ее «безопасной»:И полный фрагмент, чтобы подвести итог:
Однако обратите внимание, что это решение может показывать меньшую производительность, чем другие доступные опции, из-за широкого использования функций более высокого порядка.
источник
Если вы используете Lodash, вы можете сделать это с помощью _.isFunction .
Этот метод возвращает,
true
если значение является функцией, иначеfalse
.источник
Я обнаружил , что при тестировании встроенных функций браузера в IE8, используя
toString
,instanceof
иtypeof
не работой. Вот метод, который отлично работает в IE8 (насколько я знаю):Кроме того, вы можете проверить наличие встроенных функций, используя:
Хотя я где-то читал, что это не всегда будет работать в IE7 и ниже.
источник
Ниже, кажется, работает для меня (проверено от
node.js
):источник
Я думаю, что вы можете просто определить флаг в прототипе функции и проверить, если экземпляр, который вы хотите проверить, унаследовал это
определить флаг:
а затем проверьте, существует ли он
Недостатком является то, что другой прототип может определять тот же флаг, и тогда он бесполезен, но если у вас есть полный контроль над включенными модулями, это самый простой способ
источник
Начиная с узла v0.11 вы можете использовать стандартную функцию util:
источник
Вы должны использовать
typeOf
оператор в JS.источник
Решение, как показали некоторые предыдущие ответы, заключается в использовании typeof. ниже приведен фрагмент кода в NodeJs,
источник