检测数据类型的四种方法

检测数据类型的方式

typeof

返回结果是一个字符串,typeof不能检测null,和数组,都是返回的object
typeof可以检测基本数据类型和引用数据类型
缺点: 不能检测null 和 Array,返回的都是Object

typeof 1
"number"
typeof "1"
"string"
typeof false
"boolean"
typeof null
"object"
typeof undefined
"undefined"
typeof {}
"object"
typeof []
"object"
typeof /\d/
"object"
typeof Symbol(1)
"symbol"
typeof 2n
"bigint"
typeof function(){}
"function"

instanceof

instanceof 不能用于判断基本数据类型,只能用于判断引用数据类型,判断其是否属于某个类的实例对象
instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。

function Car(make, model, year) {
          this.make = make;
          this.model = model;
          this.year = year;
        }
        const auto = new Car(‘Honda‘, ‘Accord‘, 1998);


        console.log(typeof Car);//typeof可以检测function类型,但是不能检测Array和null
        console.log(auto instanceof Car);//true

        console.log(auto instanceof Object);//true

        console.log([1,2] instanceof Array);//true
        console.log([] instanceof Array);//true
        console.log([] instanceof Object);//true
        console.log({} instanceof Object);//true
        console.log({name:‘123‘} instanceof Object);//true
        console.log(Function instanceof Object);//true
        console.log(function(){} instanceof Object);//true
        /* *************************** */
        /* 特殊的情况 */
        console.log("1" instanceof String); //false?
        console.log(1 instanceof Number); //false?      ??注意: instanceof 不能用于判断基本数据类型,只能用于判断引用数据类型,判断其是否属于某个类的实例对象
        console.log(true instanceof Boolean); //false?
        //
        console.log(new String("1") instanceof String);//true
        console.log(new Number(1) instanceof Number);//true
        console.log(new Boolean(true) instanceof Boolean);//true

constructor

注意: constructor不能用于undefined和null的检测,因为他们没有构造函数

        console.log("".constructor===String);//true
        console.log("1".constructor===String);//true
        console.log([].constructor===Array);//true
        console.log([].constructor===Object);//false? ??这就是constructor的缺陷,检测不一定准确
        console.log({}.constructor===Object);//true
        console.log(/\d/.constructor===RegExp);//true
        console.log(/\d/.constructor===Object);//false? ?? 这就是constructor的缺陷,检测不一定准确
//注意: constructor不能用于undefined和null的检测,因为他们没有构造函数
        console.log("".constructor===String);//true
        console.log("1".constructor===String);//true
        console.log([].constructor===Array);//true
        console.log([].constructor===Object);//false? ??这就是constructor的缺陷,检测不一定准确
        console.log({}.constructor===Object);//true
        console.log(/\d/.constructor===RegExp);//true
        console.log(/\d/.constructor===Object);//false? ?? 这就是constructor的缺陷,检测不一定准确

Object.prototype.toString.call()

每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object type],其中 type 为对象的类型。但当除了 Object 类型的对象外,其他类型直接使用 toString 方法时,会直接返回都是内容的字符串,所以我们需要使用call或者apply方法来改变toString方法的执行上下文
优点:这种方法对于所有基本的数据类型都能进行判断,即使是 null和defined也能进行检测.

Object.prototype.toString.call(‘An’) // “[object String]”
Object.prototype.toString.call(1) // “[object Number]”
Object.prototype.toString.call(Symbol(1)) // “[object Symbol]”
Object.prototype.toString.call(null) // “[object Null]”
Object.prototype.toString.call(undefined) // “[object Undefined]”
Object.prototype.toString.call(function(){}) // “[object Function]”
Object.prototype.toString.call({name: ‘An’}) // “[object Object]”

检测数据类型的四种方法

上一篇:Rise in Price 题解(dp+随机数据)


下一篇:Minimum length not met: value 0 < 1 minimum length