JS判断数据类型的方式及不同判断方式的优劣

165 阅读1分钟

1、typeof

typeof操作符用来判断数据类型,返回的值为字符串,如下:

image.png 优点: 内置语法,使用便捷
缺点:使用typeof判断Array、obj、null返回的都是object,无法精确判断

2、instanceof()

instanceof操作符用来判断构造函数的prototype属性是否出现在对象的prototype链中的任何位置。返回值是一个布尔值
优点:判断某一对象的是不是另一对象的实例或当前对象的父类型

let a = [1,2,3]
a instanceof Array  // true

缺点:不适合检测一个对象本身的类型

// 检测o是否为c的实例
function C() {}
function D() {}

let c = new C()

c instanceof C // true, because: Object.getPrototypeOf(c) === C.prototype
c instanceof D // false, because D.prototype is nowhere in c's prototype chain
 instanceof Object  // true, because: C.prototype instanceof Object

// 检测父类型
function C() {}
function D() {}
let c = new C()
D.prototype = c //继承原型
var d =new D()
console.log(d instanceof D); //true
console.log(d instanceof C); //true

// 不建议检测某一数据本身的类型
// 例: 检测true是否为Boolean
true instanceof Boolean // false

3、Object.prototype.toString()

通常我们使用Object.prototype.toString来判断数据类型都会加一个call来修改this指向,因为Object.prototype.toString判断的是Object.prototype的类型,所以需要call来修改作用域,将作用域改为toString后的实际的数据类型

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

优点: 能准确判断出数据类型

最全的判断数据类型的方法:


function getType(obj) {
    if(typeof obj !== "object") {
        return typeof obj
    } else {
        return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
    }
}