• Object.prototype.toString.call()


      首先看一段ECMA中对Object.prototype.toString的解释:
    Object.prototype.toString( )
    When the toString method is called, the following steps are taken:
    1. Get the [[Class]] property of this object.
    2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.

    3. Return Result (2)

    我们知道,Javascript中,一切皆为对象。所以如下代码,应当会输出对应字符: 
    var oP = Object.prototype,
    toString = oP.toString;

    console.log(toString.call([123]));//[object Array]
    console.log(toString.call('123'));//[object String]
    console.log(toString.call({a: '123'}));//[object Object]
    console.log(toString.call(/123/));//[object RegExp]
    console.log(toString.call(123));//[object Number]
    console.log(toString.call(undefined));//[object Undefined]
    console.log(toString.call(null));//[object Null]

    //....

     标准浏览器中完美的作到,但是(为什么要说但是呢)IE6中,却会出现以下问题:

    通过Object.prototype.toString.call获取的 字符串,undefined,null均为Object 

    所以,我们又要悲剧的先对以上类型进行判断,完整代码: 
    var oP = Object.prototype,
    toString = oP.toString;

    function typeOf(value) {
        if (null === value) {
            return 'null';
        }

        var type = typeof value;
        if ('undefined' === type || 'string' === type) {
            return type;
        }

        var typeString = toString.call(value);
        switch (typeString) {
        case '[object Array]':
            return 'array';
        case '[object Date]':
            return 'date';
        case '[object Boolean]':
            return 'boolean';
        case '[object Number]':
            return 'number';
        case '[object Function]':
            return 'function';
        case '[object RegExp]':
            return 'regexp';
        case '[object Object]':
            if (undefined !== value.nodeType) {
                if (3 == value.nodeType) {
                    return (/\S/).test(value.nodeValue) ? 'textnode': 'whitespace';
                } else {
                    return 'element';
                }
            } else {
                return 'object';
            }
        default:
            return 'unknow';
        }

    } 

  • 相关阅读:
    手写一个springboot的自动配置
    linux常用命令
    设计模式之模板模式
    设计模式之策略模式
    阿里云Ubuntu18.04下安装MySQL
    阿里云安装redis以及客户端的使用
    layui 复选框 使用 及jq基本方法
    layui 下拉框 实用
    ztree插件基础用法
    面试中常用排序算法实现(Java)
  • 原文地址:https://www.cnblogs.com/sniper007/p/2227128.html
Copyright © 2020-2023  润新知