数据类型检测
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。