493 JS中数据类型检测的四种方案

  1. typeof
    语法:typeof [val] 返回当前值对应的数据类型(STRING)
    优势:检测基本类型值还是很准确的,而且操作起来方便
    略势:
    typeof null =>"object" 【01开头存储的是对象。】
    typeof 检测数组/对象/正则等都是 "object",所以无法对对象数据类型细分

  1. instanceof
    语法:[val] instanceof 类, 通过检测这个值是否属于这个类,从而验证是否为这个类型
    优势:对于数组、正则、对象可以细分一下
    略势:
    基本数据类型无法基于它来进行检测
    检测的原理:只要在当前实例的__proto__出现这个类,检测结果都是TRUR

  1. constructor
    和instanceof类似,也是非专业检测数据类型的,但是可以这样处理一下
    语法:[val].constructor === 类
    相对于instanceof来讲,基本类型也可以处理,而且因为获取实例的constructor实际上获取的是直接所属的类,
    所以在检测准确性上比instanceof还好一点
    略势:constructor是可以随意被改动的

  1. Object.prototype.toString.call([val]):最强大的检测方案
    在其它数据类型的内置类原型上有toString,但是都是用来转换为字符串的,
    只有Object基类原型上的toString是用来检测数据类型的。
    [11, 22].toString()的结果:去掉逗号后面空格的"11,22"。
    obj.toString(): obj这个实例调用Object.prototype.toString执行,方法执行里面的THIS是当前操作的实例OBJ,此方法就是检测实例THIS的数据类型的,返回结果:"[object 所属的类]"。
    Object.prototype.toString.call([val]) 基于call强制改变方法中的this是[val],就相当于在检测val的数据类型 <=> ({}).toString.call([val])
    【 ({}).toString拿到 Object.prototype.toString。{} 可以是语句块,也可以是 对象字面量。】
原文地址:https://www.cnblogs.com/jianjie/p/13217407.html