JS中准确判断变量的类型

typeof判断变量类型

用以判断基本变量类型, 对于复杂数据类型基本都返回object

console.log(typeof "hello");  // string
console.log(typeof 123);  // number
console.log(typeof true);  // boolean
console.log(typeof {});  // object
console.log(typeof []);  // object
console.log(typeof undefined);  // undefined
console.log(typeof null);  // object

instanceof检查对象是否另一个对象的实例

instanceof可以用来判断一个变量是否是某个类的实例

console.log("hello" instanceof String);  // false
console.log(new String("hello") instanceof String);  // true
console.log([1, 2, 3] instanceof Array);  // true
console.log({} instanceof Object);  // false

通过Object.prototype.toString.call()方法,可以返回变量的类型

注意, 此方法不能用于判断undefined类型

Object.prototype.toString.call('') ;           // [object String]
Object.prototype.toString.call(1) ;            // [object Number]
Object.prototype.toString.call(true) ;         // [object Boolean]
Object.prototype.toString.call(Symbol());      // [object Symbol]
Object.prototype.toString.call(undefined) ;    // [object Undefined]
Object.prototype.toString.call(null) ;         // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ;   // [object Date]
Object.prototype.toString.call([]) ;           // [object Array]
Object.prototype.toString.call({}) ;           // [object Object]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ;  // [object Error]
Object.prototype.toString.call(document) ;     // [object HTMLDocument]
Object.prototype.toString.call(window) ;       // [object Window]
Object.prototype.toString.call(/[abc]at/gi)    // [object RegExp]
Object.prototype.toString.call(undefined)      // [object Undefined]


总结

  • typeOf能判断出一个变量的类型,但是只能判断出number,string,function,boolean,undefined,null和其他对象类型返回结果都为object.

  • instanceof能判断出一个对象是否是另一个类的实例。

  • Object.prototype.toString.call能判断出所有变量的类型,返回值为[Object ***]

实现getValType函数

根据上面的分析,我们可以先用typeOf函数判断出基础类型number,string,function,boolean,undefined。然后如果结果是object,我们再用Object.prototype.toString.call来判断出具体的类型。

var getVarType = function (val) {
    var type = typeof val
    // object需要使用Object.prototype.toString.call判断
    if (type === 'object') {
        var typeStr = Object.prototype.toString.call(val)
        // 解析[object String]
        typeStr = typeStr.split(' ')[1]
        type = typeStr.substring(0, typeStr.length - 1)
    }
    return type.toLowerCase()
}

var allVarMap = {
    // 数字
    num:123,
    // Infinity
    num1: 1 / 0,
    // NaN
    num2: null / 0,
    // 字符串
    str: 'abcdef',
    // 布尔类型
    bool: true,
    // 数组
    arr :[1, 2, 3, 4],
    // json对象
    json :{name:'wenzi', age:25},
    // 函数
    func:function(){ console.log('this is function'); },
    // 箭头函数
    func1: () => {console.log('arrow function')},
    // undefined类型
    und:undefined,
    // null类型
    nul:null,
    // date类型
    date:new Date(),
    // 正则表达式
    reg :/^[a-zA-Z]{5,20}$/,
    // 异常类型
    error:new Error()
}

var results = []
for (let i in allVarMap) {
    results.push(getVarType(allVarMap[i]))
}
console.log(results.join())
// number,number,number,string,boolean,array,object,function,function,number,null,date,regexp,error

此处评论已关闭