zoukankan      html  css  js  c++  java
  • 如何判断一个对象是否为函数

    首先,在各个浏览器中 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;
    }

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

  • 相关阅读:
    Mysql 常用小技巧
    【JS学习】require('fs')(fs模块用于对系统文件及目录进行读写操作。)
    【JS学习】js中forEach与for循环
    【JS学习】ES6之async和await
    【JS学习】关于Vue.use()详解
    【Npm学习】npm run dev 和 npm run serve
    【Jenkins学习】修改插件下载源地址
    【JS学习】js中const,var,let区别
    【Go学习】知识分享之Golang——go mod时使用代理模式goproxy和私有模式GOPRIVATE
    【JS学习】export 和 export default 的区别
  • 原文地址:https://www.cnblogs.com/xiaochechang/p/5935611.html
Copyright © 2011-2022 走看看