Skip to main content

数据类型检测

typeof

检测除了 null 以外的基本数据类型,并且可以返回 object 和 function。

console.log(typeof 1); // 输出:number
...
console.log(typeof {}); // 输出:object
console.log(typeof function() {}); // 输出:function

console.log(typeof null); // 输出:object(历史遗留问题,实际上 null 是基本数据类型)

instanceof

通过查找原型链上的 prototype 来检测对象是否属于某个构造函数的实例。

class Person {}
let person = new Person();

console.log(person instanceof Person); // 输出:true
console.log(person instanceof Object); // 输出:true(所有对象都是 Object 的实例)
console.log(person instanceof Array); // 输出:false(person 不是数组的实例)

constructor

constructor 属性可以用来检测对象的构造函数,但是它不能检测 null 和 undefined。而且在某些情况下可能会不稳定,特别是当原型 prototype 被重写后。

class Person {}
let person = new Person();

console.log(person.constructor === Person); // 输出:true
console.log(person.constructor === Object); // 输出:false(因为 person 不是 Object 的实例)

Object.prototype.toString.call

一种通用的方法,可以遍历原型链,检测所有内置类型,并且能够区分自定义对象。

function getType(obj) {
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}

console.log(getType(1)); // 输出:number
...
console.log(getType({})); // 输出:object
console.log(getType(function() {})); // 输出:function

console.log(getType(null)); // 输出:null

实际使用

如果只需要检测基本数据类型,则可以在判断非 null 的情况下,使用 type。

如果需要检测全部数据类型,则应该使用 Object.prototype.toString.call。