判断数据类型的方法及区别

43 阅读1分钟

typeOf

typeOf 返回的数据类型包括已下几种:

'number' , 'string' , 'boolean' , 'symbol' , 'undefined' , 'function' , 'object' 7中类型, 返回值是字符串;

这里有一个bug,null返回的类型是'object',为什么会出现这个问题呢?

在 JavaScript 中 值以 32 位的单位存储,包括一个小型类型标记(1-3 位)和值的实际数据。类型标记存储在单元的较低位上。一共有 5 种类型:

  • 000: object,表示这个数据是一个对象的引用。
  • 1: int,表示这个数据是一个 31 位的有符号整型。
  • 010: double,表示这个数据是一个双精度浮点数的引用。
  • 100: string,表示这个数据是一个字符串的引用。
  • 110: boolean,表示这个数据是一个布尔值。

instanceof

instanceof 是判断数据是否是某个对象的实例,返回一个布尔值

用法

function Person () {}
let p = new Person();
p instanceof Person; // true

Instanceof 的核心原理是检测某个实例对象的原型链上是否存在构造函数的prototype

具体实现一下吧 这里涉及到原型链的知识点, 具体原型链 的详细内容

const myINstanceof = (leftObj, rightObj) => {
    let prototypeObj = rightObj.prototype;
    leftObj= leftObj.__proto__;
    while(leftObj) {
        if (leftObj === prototypeObj) {
            return true;
        }
        leftObj = leftObj.__proto__;
    }
    return false
};

constructor

constructor 可以查看目标构造函数,也可以判断数据类型,但是不能判断null和undefined

用法

(1).constructor === Number; // true
'str'.constructor === String; // true
true.constructor === Boolean; // true;
({}).constructor === Object; // true;

Object.prototype.toString

用法

Object.prototype.toString.call([]) // '[object Array]'
Object.prototype.toString.call('str') // '[object String]'
Object.prototype.toString.call(true) // '[object Boolean]' 
Object.prototype.toString.call(1) // '[object Number]'