• JavaScript中类型检测


    文章首发: http://www.cnblogs.com/sprying/p/4349426.html

    本文罗列了一般Js类型检测的方法,是构建Js知识体系的一小块,这篇文章是我很早之前总结的。

    一、Js中有5种基本数据类型

    Undefined 、Null、Boolean、String、Number(包含NaN)
     
    NaN和任何类型的值都不相等,包括NaN;isNaN用来判断数值是不是NaN类型  

    二、类型判断

    1. isFinite(number)
    是不是无穷大。如果是NaN,或者正负无穷大,或者非数字类型,则返回false。 
    2. typeof运算符
    使用的时候,空格或者typeof(param)
     
    返回的值
    string
    number
    boolean
    undefined
    function
    object null也返回object
     
    根据以上,判断类型可以如下:
    var obtainType = function(o){
         var t;
         if(o === null ) return “null”;
         else if(o !== o) return “NaN”;
         else if( (t = typeof o) !== ‘object’) return t;
    }
    可以识别出null、NaN string number boolean undefined function。
     
    上面最后只剩下object,比如数组的识别,自定义类型的识别
     
    3. 数组等原生类型的识别,可以采用如下
    function obtainType(type) {
        return function (obj) {
            return Object.prototype.toString.call(obj) === "[object " + type + "]"
        }
    }
    
    var isObject = isType("Object")
    var isString = isType("String")
    var isArray = Array.isArray || isType("Array")
    var isFunction = isType("Function")
    
    4. 自定义类型判断
    /**
     * 返回函数的名字,可能为空串;不是函数,返回null
     */
    Function.prototype.getName = function () {
        if ("name" in this) return this.name;
        return this.name = this.toString().match(/functions*([^(]*)(/)[1];
    };
    
    原生类型和自定义类型的object都可以判断了,于是
    /**
     * 返回:null NaN undefined string number boolean
     * function Array String Object(包括一些自定义类型) 自定义类型
     */
    var obtainType =function(o){
        /**
         * 获取参数类型
         * 对象直接量、Object.create、自定义构造函数的类属性皆为Object;
         * 识别出原生类型 (内置构造函数和宿主对象)
         */
        function classOf(obj){
            return Object.prototype.toString.call(obj).slice(8, -1);
        }
    
        /**
         * 返回函数的名字,可能为空串;不是函数,返回null
         */
        Function.prototype.getName = function () {
            if ("name" in this) return this.name;
            return this.name = this.toString().match(/functions*([^(]*)(/)[1];
        };
        var t, c, n;
        // 处理null值特殊情形
        if (o === null) return "null";
        // NaN:和自身值不相等
        if (o !== o) return "NaN";
        // 识别出原生值类型和函数、undefined
        if ((t = typeof o) !== "object") return t;
        // 识别出原生类型
        if ((c = classOf(o)) !== "Object") return c;
        // 返回自定义类型构造函数名字
        if (o.constructor && typeof o.constructor === "function" &&
            (n = o.constructor.getName()))
            return n;
        return "Object";
    };
    

    5.

    var strObj = new String('abc');
    
    typeof strObj // "object"
    
    obtainType(strObj) // "String"
    

    三、 其它

    1. Dom元素判断
    if(dom.nodeType){...Dom...}
    if(dom.createElement)
     
    2. jQuery等类型判断
    $('#aa') instanceof jQuery//不支持跨多窗口和框架子页面
     
    3. if(a) a为null undefined 0 "" NaN时自动转换成false
    一般推荐的写法
    // bad
    if (name !== '') {
        // ...stuff...
    }
    
    // good
    if (name) {
        // ...stuff...
    }
    
    // bad
    if (collection.length > 0) {
        // ...stuff...
    }
    
    // good
    if (collection.length) {
        // ...stuff...
    }
  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/sprying/p/4349426.html
Copyright © 2020-2023  润新知