现在你还在使用 typeof、instanceof、constructor 来判断数据类型吗?哈哈赶紧换一种种方式吧!
数据类型分为基本类型和引用类型:
基本类型:String、Number、Boolean、Null、Undefined、symbol(ES6)
引用类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。
js内置类型有七种:String、Number、Boolean、Null、Undefined、Symbol(ES6)、Object
判断数据类型的方法一般可以通过:typeof、instanceof、constructor、Object.prototype.toString.call();四种常用方法
1. typeof
typeof 其实就是判断参数是什么类型的实例,就一个参数, 一般只能返回如下几个结果:“number”、“string”、“boolean”、“object”、“function” 和 “undefined”。
typeof(x) = "number" //数字
typeof(x) = "string" //字符串
typeof(x) = "boolean" //布尔
typeof(x) = "object" //对象,数组和null
typeof(x) = "function" //函数
2. instanceof
instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
//语法: object instanceof constructor
var obj = {};
var date = new Date();
console.log(obj instanceof Object); //true
console.log(date instanceof Object); //true
console.log(date instanceof Date); //true
console.log('' instanceof String); //false, ?????
//另外,更重要的一点是 instanceof 可以在继承关系中用来判断一个实例是否属于它的父类型。
//例如:
function Foo(){}
Foo.prototype = new Aoo();//JavaScript 原型继承
var foo = new Foo();
console.log(foo instanceof Foo)//true
console.log(foo instanceof Aoo)//true
//上面的代码中是判断了一层继承关系中的父类,在多层继承关系中,instanceof 运算符同样适用。
//又如:
console.log(Object instanceof Object);//true
console.log(Function instanceof Function);//true
console.log(Number instanceof Number);//false
console.log(String instanceof String);//false
console.log(Function instanceof Object);//true
console.log(Foo instanceof Function);//true
console.log(Foo instanceof Foo);//false
3. constructor
constructor 是Object 的一个属性,它指向:创建对象的函数的引用(指针),(可以理解为 constructor 指向对象的构造函数)
//例子1:
function User(){}
var u = new User();
console.log(u.constructor === User );//得到true,也就是说对象的constructor属性指向他的构造函数。
//例子2:
function Person() {};
Person.prototype = {
getName() {}
}
var p1 = new Person();
console.log(p1.constructor === Person); //false
console.log(p1.constructor); //Object
//例子3:
function Aaa(){
}
Aaa.prototype.constructor = Aaa;//程序可以自动添加,当我们写个构造函数的时候,程序会自动添加这句代码
function BBB(){}
Aaa.prototype.constructor = BBB;//此时我们就修改了Aaa构造函数的指向问题
alert(Aaa.construtor === Aaa);//false
//例子4
var o2 = Object.create(null);
console.log(o2.constructor) //undefined, 使用Object.create()创建的js对象,没有constructor
4. Object.prototype.toString.call()
Object.prototype.toString (可以说不管是什么类型,它都可以立即判断出)
toString 是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,更严格的讲是
toString 运行时this指向的对象类型, 返回的类型格式为 [object xxx] , xxx是具体的数据类型,其中包括:
String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,… 基本上所有对象的类型都可以通过这个方法获取到。
//example
var str = 'hello';
console.log(Object.prototype.toString.call(str));//[object String]
var bool = true;
console.log(Object.prototype.toString.call(bool))//[object Boolean]
var num = 123;
console.log(Object.prototype.toString.call(num));//[object Number]
var nul = null;
console.log(Object.prototype.toString.call(nul));//[object Null]
var und = undefined;
console.log(Object.prototype.toString.call(und));//[object Undefined]
var oDate = new Date();
console.log(Object.prototype.toString.call(oDate));//[object Date]
var json = {};
console.log(Object.prototype.toString.call(json));//[object Object]
var arr = [];
console.log(Object.prototype.toString.call(arr));//[object Array]
var reg = /a/;
console.log(Object.prototype.toString.call(reg));//[object RegExp]
var fun = function(){};
console.log(Object.prototype.toString.call(fun));//[object Function]
var error = new Error();
console.log(Object.prototype.toString.call(error));//[object Error]
5. 方法封装
/**
* 类型检测封装
* @param data 检测值
* @reutn string/number/object...
*/
const getType = data => {
return Object.prototype.toString
.call(data)
.split(" ")[1]
.slice(0, -1)
.toLowerCase();
}
备注: 为了严格起见,尽量使用 Object.prototype.toString 来做类型判断!