检测数据类型的四种方案

155 阅读2分钟

这篇文章主要是我学习的笔记,希望能给你带来启发:

  • typeof
  • instanceof
  • constructor
  • Object.prototype.toString.call

一、数据类型检测一:typeof

  • 返回的结果都是字符串
  • 字符串包含了对应的数据类型"number"/"string"/"boolean"/"undefined"/"object"/"function"
  • 局限性:
    • 1、typeof null=>"object" null不是对象,它是空对象指针
    • 2、 检测数据或者正则等特殊对象,返回结果都是"object",所以无法基于typeof判断是数据还是正则
  console.log(typeof 12);        //"number" 
  console.log(typeof []);        //"object"
  console.log(typeof typeof []); //"string"

二、数据类型检测二:instanceof

  • 检测某个实列是否属于这个类
  • 检测的底层机制:所有出现在其原型链上的类,检测结果都是ture
console.log(12 instanceof Number);            //=>false
console.log(new Number(12)instanceof Number);//=>ture
console.log([] instanceof Array);           //=>ture
console.log([] instanceof Object);          //=>ture
  • 局限性
    • 由于可以基于__proto__或者prototype改动原型链的动向,所有基于instanceof检测出来的结果并不一定是准确的
    • 基本数据类型的值,连对象都不是,更没有__proto__,虽说也是所属类的实列,在js中也可以调取所属类原型上的方法,但是instanceof 是不认的
     function Fn(){
     Fn.prototype.__proto__=Array.prototype;
     let f=new Fn();
     //原型链:f ->Fn.prototype ->Array.prototype ->
     Object.prototype
    }
    

    三、数据类型检测三:constructor

    constructorinstanceof检测数据的方法是类似的就不再赘述了,直接参考上例即可。

    四、数据类型检测四:Object.prototype.toString.call(value)

    语法({}).toString.call([value])
  • 不是用来转换为 字符串的,而是返回当前实列所属类的信息
  • 格式:"[object 所属类信息]"
  • "[object Object/Array/String/Null/undefined/Number/Symbol/functin...]"
  • 这种方式基本上没有什么局限性,是检测数据类型最准确的方式

如图所示:

  • "[object object/Array]"
  • Number/String/Boolean/Symbol他们的原型上都有:
    • 1、toString:转化成为字符串
    • 2、valueof:返回原始值
  • Array/RegExp/Function等内置的原型上都有 :
    • 1、toString:转化成为字符串
    • 2、valueof:返回原始值
  • object的原型上有:
    • 1、toString:返回当前实列所属类的信息
    • 2、valueof:返回原始值