如何判断一个对象是否为函数

首先,在各个浏览器中 HTML元素节点 的返回值有所差异:

1、Firefox2 和 Firefox3

在这两个浏览器中,用 typeof 检测 HTML 对象元素的类型,得到是一个不精确的 “function” 结果,而不是 “object”,如 HTMLDocument。如:

alert(typeof HTMLDocument); 
// 在 Firefox2 中结果是 "function"; 
// 在 Firefox3 中结果是 "object";

2、Firefox2

对于正则表达式,在该浏览器中返回的结果是 “function”(在 Firefox3 中结果是 “object”),如:

var reg = /test/; 
alert(typeof reg); 
// 在 Firefox2 中结果是 "function"; 
// 在 Firefox3 中结果是 "object";

注:本人在 safari 中测试,其结果也是 “function”。

3、IE6 和 IE7

在 IE 中对 DOM 元素使用 typeof 方法,得到的结果是 “object”。如:

alert(typeof document.getElementsByTagName("body")[0].getAttribute); 
// 结果是 "object"

4、Safari 3 
safari 认为 DOM 元素的 NodeList 是一个函数,如:

alert(typeof document.body.childNodes); 
// 结果是 "function"

很明显,如果你要测试一个对象是否为函数,使用 typeof 方法并不能从真正意义上保证测试结果。那么,我们就需要一种在所有浏览器中都能保证测试结果的解决方案。我们知道 function 本身有 apply() 和 call() 两种方法,但这两个方法在 IE 中存在问题的函数中并不存在,试试下面的测试:

alert(typeof document.getElementsByTagName("body")[0].getAttribute.call) 
// 在 IE 中结果是 "undefined"

所以有一种方法:

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

参考:http://www.jb51.net/article/19841.htm

此外还有一种方法:

/**
 * 判断对象是否为函数,如果当前运行环境对可调用对象(如正则表达式)
 * 的typeof返回‘function‘,采用通用方法,否则采用优化方法
 *
 * @param {Any} arg 需要检测是否为函数的对象
 * @return {boolean} 如果参数是函数,返回true,否则false
 */
function isFunction(arg) {
    if (arg) {
        if (typeof (/./) !== ‘function‘) {
            return typeof arg === ‘function‘;
        } else {
            return Object.prototype.toString.call(arg) === ‘[object Function]‘;
        }
    } // end if
    return false;
}

参考:如何判断一个对象是否为函数

时间: 2024-10-24 11:42:35

如何判断一个对象是否为函数的相关文章

如何用js判断一个对象是不是Array

.如何用js判断一个对象是不是Array 1.Array.isArray(obj) 调用数组的isArray方法 2.obj instanceof Array 判断对象是否是Array的实例 3.Object.prototype.toString.call(obj) ==='[object Array]' Object.prototype.toString方法会取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于[object Array]的字符串作为结果,call用来改变

js判断一个对象是否为数组

1,真正的数组的判断方法 javascript中最简单的声明数组方法为: var a = []; 判断是否为数组的最直接的方法为: 复制代码 代码如下: a instanceof Array //true a .constructor == Array //true 这里涉及到一个instanceof语法,instanceof是一个云算符,与"+-*/"一样,它的语法如下: result = obj intanceof class 是用来判断一个对象是否是某个class的一个实例,运算

javascript判断一个对象是否是空对象,localStorage和sessionStorage区别

判断一个对象是否是空对象: var obj ={}; 1. if(JSON.stringify(newobj)=="{}"){ console.log('kongduixiang')  }else{ console.log('hehe')  } 2. if(Object.keys(newobj).length == 0){ console.log('kongduixiang'); } localStorage和sessionStorage区别: localStorage和session

怎么判断一个对象是不是数组类型?

前面<变量的赋值和对象的赋值>中有用到typeof运算符去判断运算数的类型,结果如下: alert(typeof 1); // 返回字符串"number" alert(typeof "1"); // 返回字符串"string" alert(typeof true); // 返回字符串"boolean" alert(typeof {}); // 返回字符串"object" alert(typeof

判断SQL数据库中函数、存储过程等是否存在的方法

下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助.库是否存在if exists(select * from master..sysdatabases where name=N'库名')print 'exists'elseprint 'not exists'----------------- 判断要创建的表名是否存在if exists (select * from dbo.sysobjects where id = object

JavaScript中判断一个对象是否为&quot;空对象”

JavaScript中判断一个对象是否为"空对象" 这里指的"空对象"是类似于:{ } 和 new Object() 这样的. 具体的代码实现和原理如下: // 所谓"空对象",即不包括任何可枚举(自定义)的属性.简而言之,就是该对象没有属性可以通过for...in迭代. // for-in循环会同时枚举非继承属性和从原型对象继承的属性,如果有,则立即返回false,否则默认返回true. isEmptyObject: function (obj

js如何判断一个对象是不是Array?

在开发中,我们经常需要判断某个对象是否为数组类型,在Js中检测对象类型的常见方法都有哪些呢? typeof 操作符 对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时 1 var arr=new Array("1","2","3","4","5"); 2 alert(typeof(arr)); 你会收到一个object 的答案

2-12python使用any判断一个对象是否为空的方法

这篇文章主要介绍了python使用any判断一个对象是否为空的方法,并给出了改进的方法供大家对比参考,具有一定的借鉴价值,需要的朋友可以参考下 本文实例讲述了python使用any判断一个对象是否为空的方法.分享给大家供大家参考. 具体实现代码如下: >>> eth = {"eth0″:"192.168.1.1″} >>> any(eth) True >>> eth = {} >>> any(eth) False

判断类是否存在函数class_exists用法分析

原文地址:判断类是否存在函数class_exists用法分析 如果我们要判断一个类是不是可以用,可以先使用class_exists函数来判断一下,下面来看几个例子. bool class_exists ( string $class_name [, bool $autoload = true ] ) 此功能是否给定的类被定义检查.this function checks whether or not the given class has been defined.返回true,如果class_