js检测数据类型得四种方式

1.typeof:返回一个字符串,表示操作数的类型。  

语法:

    typeof(变量)
    //or
    typeof 变量

示例:

    console.log(typeof 2)//number
    console.log(typeof true)//boolean
    console.log(typeof 'str')//string
    console.log(typeof function () {
    })//function
    console.log(typeof console.log);//function
    console.log(typeof {})//object
    console.log(typeof [])//object
    console.log(typeof (new Date()))//object
    console.log(typeof window)////object
    console.log(typeof undefined)//undefined
    console.log(typeof null)//object
    console.log(typeof Symbol());      //symbol(es6)
    console.log(typeof 23423n);        //bigint(谷歌67版本新提出)

总结:

  •    typeof 的返回类型为字符串,值有:number、boolean、string、object、function、undefined、symbol、bigint
  •    typeof 一般用来判断基本数据类型,除了判断null会输出"object",其它都是正确的
  •    typeof 判断引用数据类型时,除了判断函数会输出"function",其它都是输出"object"    

注意:这里涉及两个经常考的面试题!

  •     null 的数据类型是object (null是一个空的引用对象,是一个占位符)
  •    console.log 的数据类型是function
  •    对于引用数据类型的判断,使用typeof并不准确,所以可以使用instanceof来判断引用数据类型

2.instanceof:用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型。  

语法:

obj1 instanceof obj2 //obj1 是否是 obj2的实例

示例:

    console.log(2 instanceof Number)//false
    console.log(true instanceof Boolean)//false
    console.log('str' instanceof String)//false
    console.log([] instanceof Array)//true
    console.log(function () {
    } instanceof Function)//true
    console.log({} instanceof Object)//true

 总结:  

  •     instanceof 只能正确判断引用数据类型,而不能判断基本数据类型。
  •     instanceof 返回值为布尔值

注意:  

  •     instanceof只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型

3.constructor:该属性本来是原型对象上的属性,指向构造函数。但是根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用constructor属性的。  

示例:

    var num = 123;
    console.log(num.__proto__)//Number {0, constructor: ƒ, toExponential: ƒ, toFixed: ƒ, toPrecision: ƒ, …}
    console.log(num.constructor)// Number() { [native code] }
    console.log(num.constructor == Number)//true

补充:

    function Person() {
    }

    var Tom = new Person();
    // undefined和null没有constructor属性,所以只有在确定待判断的值不是undefined和null才能使用
    console.log(Tom.constructor == Person)//true
    console.log((123).constructor == Number)//true
    console.log('abcdef'.constructor == String)//true
    console.log((true).constructor == Boolean)//true
    console.log([1, 2, 3, 4].constructor == Array)//true
    console.log(new Date().constructor == Date)//true
    console.log(new Error().constructor == Error)//true
    console.log(window.constructor == Window)//true

总结:

所有对象(使用 Object.create(null) 创建的对象除外)都将具有 constructor 属性。在没有显式使用构造函数的情况下,创建的对象(例如对象和数组文本)将具有 constructor 属性,这个属性指向该对象的基本对象构造函数类型。  

注意:

  •      null和undefined是无效的对象,所以他们不会有constructor属性!
  •     函数的constructor是不稳定的,主要是因为开发者可以重写prototype,如果创建一个对象来改变它的原型,constructor 就不能用来判断数据类型了:
    function Fn() {
    }
    var f_test = new Fn()
    console.log(f_test.constructor == Fn)//true
    ```
    修改其prototype后
    ```
    Fn.prototype = new Array()
    var f_test = new Fn()
    console.log(f_test.constructor == Fn)//false
    console.log(f_test.constructor == Array)//true

4.Object.prototype.toString.call()  

   官网解释:每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型。以下代码说明了这一点:
   var o=new Object()
   console.log(o.toString())//[object Object]
对于 Object 对象,直接调用 toString()  就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

示例:

    console.log(Object.prototype.toString.call(''));              // [object String]
    console.log(Object.prototype.toString.call(1));               // [object Number]
    console.log(Object.prototype.toString.call(true));            // [object Boolean]
    console.log(Object.prototype.toString.call(Symbol()));         // [object Symbol]
    console.log(Object.prototype.toString.call(undefined));       // [object Undefined]
    console.log(Object.prototype.toString.call(null));            // [object Null]
    console.log(Object.prototype.toString.call(new Function()));  // [object Function]
    console.log(Object.prototype.toString.call(new Date()));      // [object Date]
    console.log(Object.prototype.toString.call([]));              // [object Array]
    console.log(Object.prototype.toString.call(new RegExp()));    // [object RegExp]
    console.log(Object.prototype.toString.call(new Error()));     // [object Error]
    console.log(Object.prototype.toString.call(document));        // [object HTMLDocument]
    console.log(Object.prototype.toString.call(window));          // [object global] window 是全局对象 global 的引用

参考:JS中检测数据类型的四种方法

posted @ 2022-10-08 16:14  爱喝酸奶的吃货  阅读(893)  评论(0编辑  收藏  举报