美文网首页
JS_精准地判断数据类型

JS_精准地判断数据类型

作者: learninginto | 来源:发表于2022-03-02 11:18 被阅读0次

    判断数据类型的三种方式

    1. typeof

    typeof对于原始类型来说,除了null都可以显示正确的类型;对于对象来说,除了函数,其他都会显示object,所以typeof可以正确识别:Undefined、Boolean、Number、String、Symbol、Function 等类型的函数,但是对于其他的都会认为是object,比如Null、Date等,所以通过typeof来判断数据类型会不准确。

    typeof 12;  //number
    console.log(typeof 12 === "number");    //true
    typeof typeof 12;   //String
    typeof typeof typeof 12     //String
    

    如果我们想判断一个对象的正确类型,可以考虑使用instanceof,因为内部机制是通过原型链来判断的。

    2. instanceof

    instanceof是用来判断一个对象在其原型链中是否存在一个构造函数的prototype属性,可以用来判断数组和对象,但不能用于基础数据类型。

    a instanceof b:判断a是否为b的实例,可以用于继承关系中

    b是c的父对象,a是c的实例,a instanceof b 与 a instanceof c 结果均为true

    const Person = function () { }
    const p1 = new Person()
    console.log(p1 instanceof Person) //true
    
    var str = 'hello world'
    console.log(str instanceof String) //string
    
    var str1 = new String('hello world')
    console.log(str1 instanceof String) //true
    

    对于原始类型来说,想直接通过instanceof来判断类型是不行的。

    当然还可以使用对象的Symbol.hasInstance属性,指向一个内部方法,自定义 instanceof 操作符在某个类上的行为,让instanceof判断原始类型。

    class MyClass {
        [Symbol.hasInstance](foo) {
            return foo instanceof Array;
        }
        static [Symbol.hasInstance](str) {
            return typeof str === 'string';
        }
    }
    
    var x = new MyClass();
    console.log([1, 2, 3] instanceof new MyClass())//true
    console.log(x[Symbol.hasInstance]([0, 0, 0]))//true
    console.log('hello' instanceof MyClass)//true,调用static静态方法
    console.log(MyClass[Symbol.hasInstance](2))//false,调用static静态方法
    console.log(x instanceof MyClass)//false,因为修改了静态方法。x本身是MyClass类的实例,如果注释了静态方法就会返回true
    

    当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用

    3. Object.prototype.toString.call();
    console.log(Object.prototype.toString.call("jerry"));   //[object String]
    console.log(Object.prototype.toString.call(12));        //[object Number]
    console.log(Object.prototype.toString.call(true));      //[object Boolean]
    console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
    console.log(Object.prototype.toString.call(null));      //[object Null]
    console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
    console.log(Object.prototype.toString.call(function(){}));//[object Function]
    console.log(Object.prototype.toString.call([]));          //[object Array]
    console.log(Object.prototype.toString.call(new Date));     //[object Date]
    console.log(Object.prototype.toString.call(/\d/));        //[object RegExp]
    function Person(){};
    console.log(Object.prototype.toString.call(new Person));//[object Object]
    
    • 封装
    getTypeof(data){
        let dataType = Object.prototype.toString.call(data);
        //[object Array] [object Number] [object String] ……
        return DataType.slice(8, -1)
    }
    

    相关文章

      网友评论

          本文标题:JS_精准地判断数据类型

          本文链接:https://www.haomeiwen.com/subject/bgmsrrtx.html