• 学会使用高级函数的安全类型检测


    js内置的类型检测机制并非完全可靠,比如typeof操作符,safari直到第四版在对正则表达式应用typeof操作符时会返回function,因此很难确定某个值到底是不是函数。

    再比如instanceof操作符在在存在多个全局作用域(像一个页面包含多个frame)也是问题多多。比如

    let isArray = value instanceof Array;
    
    

    以上代码要返回true,value必须是一个数组,而且必须和Array构造函数在同个全剧作用域中。(别忘了,Array是window的属性。)如果value是在另个frame中定义的数组,那么以上代码就会返回false。

    解决上述问题的方法都一样。大家都知道,在任何值上调用Object原生的toString() 方法,都会返回一个[object NativeConstructorName]格式的字符串。每个类在内部都有一个[[class]]属性。在这个属性中就指定了上述字符串中的构造函数名。

    alert(Object.prototype.toString.call(value));   //[object Array]
    
    

    由于原生数组的构造函数名与全剧作用域无关,因此使用toString()能保证返回一致的值。

    function isArray(value) {
        return Object.prototype.toString.call(value) == '[object Array]'
    }
    
    
    function isFunction(value) {
        return Object.prototype.toString.call(value) == '[object Function]';
    }
    
    function isRegExp(value) {
        return Object.prototype.toString.call(value) == '[object RegExp]';
    }
    

    检测原生JSON对象。Object的toString()方法不能检测非原生构造函数的构造函数名。因此,开发人员定义的任何构造函数都将返回[object Object]

    let isNativeJSON = window.JSON && Object.prototype.toString.call(JSON) == "[object JSON]"
    

    扫码加群,每日更新一篇前端技术文章一起成长。

  • 相关阅读:
    AWK 学习手札, 转载自lovelyarry
    Perl 学习手札之一: introduction
    开发者必看:iOS应用审核的通关秘籍
    Perl 学习手札之三: General syntax
    Perl 学习手札之二: Guide to experienced programmers
    RepotService添加空格符
    CSMS2软件架构
    关于Oracle的动态查询
    CSMS2公共方法
    CSMS2绑定数据
  • 原文地址:https://www.cnblogs.com/bbqq1314/p/12545473.html
Copyright © 2020-2023  润新知