判断数据类型的三种方式
1. typeof
typeof对于原始类型来说,除了null都可以显示正确的类型;对于对象来说,除了函数,其他都会显示object,所以typeof可以正确识别:Undefined、Boolean、Number、String、Symbol、Function 等类型的函数,但是对于其他的都会认为是object,比如Null、Date等,所以通过typeof来判断数据类型会不准确。
typeof 12; //number
console.log(typeof 12 === "number"); //true
typeof typeof 12; //String
typeof typeof typeof 12 //String
如果我们想判断一个对象的正确类型,可以考虑使用instanceof,因为内部机制是通过原型链来判断的。
2. instanceof
instanceof是用来判断一个对象在其原型链中是否存在一个构造函数的prototype属性,可以用来判断数组和对象,但不能用于基础数据类型。
a instanceof b:判断a是否为b的实例,可以用于继承关系中
b是c的父对象,a是c的实例,a instanceof b 与 a instanceof c 结果均为true
const Person = function () { }
const p1 = new Person()
console.log(p1 instanceof Person) //true
var str = 'hello world'
console.log(str instanceof String) //string
var str1 = new String('hello world')
console.log(str1 instanceof String) //true
对于原始类型来说,想直接通过instanceof来判断类型是不行的。
当然还可以使用对象的Symbol.hasInstance属性,指向一个内部方法,自定义 instanceof 操作符在某个类上的行为,让instanceof判断原始类型。
class MyClass {
[Symbol.hasInstance](foo) {
return foo instanceof Array;
}
static [Symbol.hasInstance](str) {
return typeof str === 'string';
}
}
var x = new MyClass();
console.log([1, 2, 3] instanceof new MyClass())//true
console.log(x[Symbol.hasInstance]([0, 0, 0]))//true
console.log('hello' instanceof MyClass)//true,调用static静态方法
console.log(MyClass[Symbol.hasInstance](2))//false,调用static静态方法
console.log(x instanceof MyClass)//false,因为修改了静态方法。x本身是MyClass类的实例,如果注释了静态方法就会返回true
当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用
3. Object.prototype.toString.call();
console.log(Object.prototype.toString.call("jerry")); //[object String]
console.log(Object.prototype.toString.call(12)); //[object Number]
console.log(Object.prototype.toString.call(true)); //[object Boolean]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([])); //[object Array]
console.log(Object.prototype.toString.call(new Date)); //[object Date]
console.log(Object.prototype.toString.call(/\d/)); //[object RegExp]
function Person(){};
console.log(Object.prototype.toString.call(new Person));//[object Object]
- 封装
getTypeof(data){
let dataType = Object.prototype.toString.call(data);
//[object Array] [object Number] [object String] ……
return DataType.slice(8, -1)
}