在js中用来检测数据类型的四种方式

1.typeof

2.instanceof

3.constructor

4.Object.prototype.toString.call()

Array.isArray 检测是否为一个数组

一、typeof 详解

  • 特点1 返回结果首先是一个字符串,其次字符串中包含了对应的数据类型
    • ‘number’
    • ‘string’
    • ‘boolean’
    • ‘undefined’
    • ‘object’
    • ‘function’
    • ‘bigint’
  • 特点2:按照计算机底层存储的二进制进行检测 检测性能高
    • 原理:按照二进制值检测 {000:对象 1:整数 010:浮点数 100:字符串 110:布尔 undefined:-2^30 null:全是零}
  • 特点3:typeof null -> “object”
  • 特点4 :typeof 不能细分对象
    • typeof 函数 ->”function” 「可以调用call方法,可执行」
  • 特点5:基于typeof检测一个未被声明的变量,不会报错,结果是“undefined” => 你可以理解为这是浏览器的一个BUG「暂时性死区」
    • 用于插件封装中的暴露API
  • image.png

image.png
注意:
检测对象类型 只有funciton是function 其他的对象类型(数组array、正则、普通对象)都是”object” ,所以用typeof 检测的话,并不能细分。
问题:typeof null=>”object” typeof {name:’曹亚倩’}为什么也等于 “object” 因为是根据二进制检测 null和对象的前三位相同
typeof function 为什么能检测出 “function” 因为function检验对象的时候先判断是不是调用call方法

  1. typeof "zhufeng" ====》"string"
  2. typeof 12 ===> "number"
  3. typeof false ===>"boolean"
  4. typeof true ====> "boolean"
  5. typeof null ====> "object"
  6. typeof undefined ====>"undefined"
  7. typeof Symbol()=>"symbol"
  8. typeof 456n=>"bigint"
  9. //引用数据类型,除了function,typeof检测是function,其余检测返回的都是“object”
  10. typeof [1,2] =====>"object"
  11. typeof function(){} =>"function"

*当typeof 超过两个写的时候 返回值都是字符串string

typeof []===>"object"
typeof typeof []===>"string"

二、instanceof

  • 1、定义:用来检测某个实例是否属于这个类
    • 当前类的原型只要出现在了实例的原型链上就返回true
  • 2、语法:实例 instanceof 类
  • 3、属于返回TRUE,不属于返回FALSE
  • 4、优点:

    • 基于这种方式,可以弥补 typeof 无法细分对象类型的缺点(想检测这个值是否为数组,只需要看他是否为Array类的实例即可)
      let arr = [10, 20];
      console.log(typeof arr); //=>"object"
      console.log(arr instanceof Array); //=>true
      console.log(arr instanceof RegExp); //=>false
      console.log(arr instanceof Object); //=>true  不管是数组对象还是正则对象,都是Object的实例,检测结果都是TRUE,所以无法基于这个结果判断是否为普通对象
      
  • 5、局限性:

    • 1)、要求检测的实例必须是对象数据类型的
    • 2)、基本数据类型的实例是无法基于它检测出来的
      • 字面量方式创建的不能检测
      • 构造函数创建的就可以检测
    • 3)、不管是数组对象韩式正则对象,都是 Object 的实例,检测结果都是 TRUE ,所以无法基于这个结果判断是否为普通对象
      // instanceof检测的实例必须都是引用数据类型的,它对基本数据类型值操作无效
      console.log(10 instanceof Number); //=>false
      console.log(new Number(10) instanceof Number); //=>true
      // instanceof检测机制:验证当前类的原型prototype是否会出现在实例的原型链__proto__上,只要在它的原型链上,则结果都为TRUE
      function Fn() {}
      Fn.prototype = Object.create(Array.prototype);
      let f = new Fn;
      console.log(f instanceof Array); //=>true f其实不是数组,因为它连数组的基本结构都是不具备的 
      复制代码
      
      注意️:它本身不能完成数据类型检测,只是利用它(检测某个实例属否属于这个类的)特征来完成数据检测