js-四种数据类型检测

93 阅读2分钟

1、typeof

  1. 简单方便,大部分数据都可以有效检测

2)typeof null --> "Object" js设计的缺陷:数据值都是按照二进制存储的值进行检测

1 开头为整数 ;

010 为浮点数 ;

100为字符串;

110 为布尔;

000 为对象

-2^30 undefined

  1. typeof 不能细分具体的对象数据类型值,所有对象数据类型值,检测出来都是“object”;

  2. typeof 检测基于构造函数创建出来的基本数据类型的实例对象,结果也是“object”;

2、Object.prototype.toString.call([value])

  1. 万全之策;

2) 大部分内置类的原型上都有toString, 但是一般都是转换为字符串, 只有Object.prototype 上的String 并不是转换为字符串,而是返回当前实例所属类的信息“【object 所属构造函数的信息】”

3)所属构造函数的信息是根据Symbol.toStringTag 获取的【有这个属性基于这个属性,没有浏览器自己计算】

注:function * fn() {} console.log(Object.prototype.toString.call(fn)) --> '[object GeneratorFunction]'

3、instanceof

  1. 检测某个实例是否属于这个类;

2)基于instanceof 可以细分一下不同类型的对象【也可以检测出基于构造函数方式创建出来的基本类型对象值】

3)原理:

构造函数 static [Symbol.hasInstance] (实例) ;

检测当前实例所处的原型链上,出否会出现在这个构造函数,如果能出现,结果就是true,反之就是false

注:在JS 中原型链是可以改变的,所有结果不准确

所有实例的原型链都指向Object.prototype, 所以 实例 instanceof Object ---> true

字面量方式创造的基本数据类型值是无法基于 instanceof 检测的【浏览器默认不会把它转换为new 创建的方式】,因为本身不是对象,不存在__proto__这个东西。

4、constructor

1)constructor 是可以肆意被修改,所以不准 只找父类原型;

2) 基于字面量方式创造的基本数据类型也可以用 let n = 10; n.constructor === Nmber ---->true