js中数据类型检测

34 阅读1分钟

typeof

  • 直接在计算机底层基于数据类型的值(二进制)进行检测的。

  • typeof null 为 “object” 是因为对象存储在计算机中都是以000开始的二进制存储的,null是全0,所以检测出来的结果是对象。
  • typeof 普通对象/数组/正则对象/日期对象 都是“object”

instanceof「检测当前实例是否属于这个类 」

检测当前实例是否属于这个类。

  • 可以用来检测对象类型。
  • 底层机制:只要当前类出现在实例的原形链上,结果都为true。

存在的问题:

  1. 由于可以肆意修改原形的指向,所以检测出来的结果是不准的。
  1. 不可以检测基础类型!!

手写instanceof

function instance_of(example,classFunc){
	let classPrototype = classFunc.prototype
  // 为了适配ie ,因为ie不支持example.__proto__这种写法
      proto = Object.getPrototypeOf(example);// 相当于 example.__proto__
  while(true){
    // 找到了Object.__proto__
    if(proto===null) return false;
    if(proto===classPrototype){
      // 查找过程中找到了,则证明实例是这个类的一个实例
      return true;
    }
    // 继续往上找
    proto = Object.getPrototypeOf(proto)
  }
  
}

constructor

constructor 类的构造函数,

  • 可以检验基本类型、对象!!

  • 但是 constructor 可以随便改,所以也不准!!

Object.prototype.toString.call([val])

标准检测数据类型的方法!!!

原理:Object.prototype.toString 不是用来转换为字符串,而是返回当前实例所属类的信息的!!

如:

let obj={
  name:'111'
}
// alert 就会调用obj.toString
alert(obj) // [object Object]

// obj.toString() ==>[object Object]
// + 上面的this 是obj,所以检测的是obj它的所属类信息

全都可以检测!!Object.prototype.toString 是标准检测的方法!!

封装万能的检测方法

可以用typeof+object.prototype.toString.call() 进行封装