typeof

typeof 一般被用于判断一个变量的类型,我们可以利用 typeof 来判断 number , string , object , boolean , function , undefined , symbol这七种类型。
image.png

  • 能够准确的判断基本数据类型,对于复杂数据类型并不准确

    constructor

    prototype原型对象是函数的子对象,每个函数都拥有一个原型对象,原型对象拥有一个子属性 constructor ,是一个静态的指针,指向原型对象的所属函数。
    原理是利用原型属性以及对象范围机制
    image.png

  • 不能验证undefined、null,因为它们不能通过 . 访问

    instanceof

    instanceof 运算符用检测构造函数的 prototype 属性是否出现在某个实例对象的原型上(这个对象是不是这个构造函数的实例)
    准确的说是:instanceof 检测实例的原型链中是否包含指定构造函数的原型。
    console.log(arr instanceof Array)
    表示:arr是不是Array的实例,arr是不是Array创建的
    原理: 通过查找对象的隐式原型 是否严格等于 对应类型的显示原型
    image.png
    不精准,无法判断基本数据类型。因为实例化必须是一个对象,不能是基本数据类型

  1. console.log(123 instanceof Number) // false
  2. console.log('123' instanceof String) // false
  3. console.log(true instanceof Boolean) // false

实现一个instanceof

Object.prototype.toString.call()

借用对象上的toString()方法

image.png

  1. function isArray(x) {
  2. return x.constructor.toString().indexOf("Array") > -1;
  3. }
  4. //假如对象原型包含单词 "Array" 则返回 true 检测数组
  1. function getClass(o){
  2. return Object.prototype.toString.call(o).slice(8,-1).toLowerCase();
  3. }
  4. //返回数据类型 检测一切数据类型