资讯专栏INFORMATION COLUMN

js中判断是否为一个函数

Atom / 833人阅读

摘要:来实现,这个函数可以获得对象的内部属性,函数执行过程如下使用方法如下参考资料

怎么判断一个对象是一个函数呢?一般情况下,我们都是使用typeof来进行类型判断,但是这个办法并不是想象的那么好用,偶然使用typeof来判断正则表达式时,发现在firefox2中返回的是"object",firefox3中返回"function",特介绍一种稳定的判断方案:


function isFunction(fn) {
    return (!!fn&&!fn.nodename&&fn.constructor!=String&&fn.constructor!=RegExp&&fn.constructor!=Array&&/function/i.test(fn+""));
}

解释:首先判断对象存在,检测是不是DOM元素,constructor指向创建当前对象的构造函数,那么这些fn.constructor!=String&&fn.constructor!=RegExp&&fn.constructor!=Array大家就能明白了吧,最后一个表达式/function/i.test(fn+""),先将fn转换成字符串,类似于"function name(){...}",然后查找字符串中有没有“function”,/i表示查找模式中忽略大小写

看了评论之后,推荐一种更好用的办法,能够判断Array,String,Data,Function,Boolean,Number等类型。Object.prototype.toString()来实现,这个函数可以获得对象的内部属性(class),函数执行过程如下:

Get the [[Class]] property of this object.

Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.

Return Result (2)

使用方法如下:


function isFunction(fn) {
   return Object.prototype.toString.call(fn)=== "[object Function]";
}

参考资料Object.prototype.toString() - JavaScript | MDN

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85684.html

相关文章

  • js笔记内容

    摘要:定义运算符用来判断一个构造函数的属性所指向的对象是否存在另外一个要检测对象的原型链上,用于引用类型。但其实,实例的来自于构造函数的。 一、关于css 样式优先级: 行内样式>id选择器样式>类选择器样式>标签选择器样式>通配符选择器的样式>继承样式>默认样式 二、关于js 关于问题:**JavaScript中的所有事物都是对象??** 从typeof和instanceo...

    n7then 评论0 收藏0
  • JS学习之Object

    摘要:文中的多为构造函数原型对象属性为函数的专属属性,表示函数的原型对象。关于各种数据类型的属性的展示对象的构造器函数该属性指向创建该对象原型的构造函数。对对象的冻结状态的设置和判断,前者让冻结对象,后者判断对象是否被冻结。 前言 上篇文章介绍了JS的对象,本文将介绍Object这个基类,主要介绍其属性和方法(其实这些在MDN里都有^_^,点击这里可以直通MDN)。好了废话不多说了,直接开始...

    qujian 评论0 收藏0
  • <<编写可维护的javascript>> 笔记8(避免'空比较&#

    摘要:中常常会看到这种代码变量与的比较这种用法很有问题用来判断变量是否被赋予了一个合理的值比如不好的写法执行一些逻辑这段代码中方法显然是希望是一个数组因为我们看到的拥有和这段代码的意图非常明显如果参数不是一个数组则停止接下来的操作这种写法的问题在 js中, 常常会看到这种代码: 变量与null的比较(这种用法很有问题), 用来判断变量是否被赋予了一个合理的值. 比如: const Contr...

    young.li 评论0 收藏0
  • 通过源码解析 Node.js 一个文件被 require 后所发生的故事

    摘要:在中,要说如果有几乎会在每一个文件都要用到的一个全局函数和一个全局对象,那应该是非和莫属了。它们是模块机制的基石。若仍未返回,则为指定的模块路径依次加上,和,判断是否存在,若存在则返回拼接后的路径。 在 Node.js 中,要说如果有几乎会在每一个文件都要用到的一个全局函数和一个全局对象,那应该是非 require 和 module.exports 莫属了。它们是 Node.js 模块...

    lcodecorex 评论0 收藏0
  • js闭包的底层实现和开发技巧

    摘要:没有清空的原因是,内部函数返回的匿名函数的作用域链仍然保有对外部函数的变量的引用。在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,直至作为作用域链终点的全局执行环境。 前言 闭包这个概念几乎成了JavaScript面试者必问的话题之一,可以毫不客气地说对闭包的理解和运用体现了一名js工程师的功底。那么闭包到底是什么,它又能带来什么特别的作用?网上...

    Caizhenhao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<