js 对象类型检测,Object.prototype.toString.call()

现在你还在使用 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 来做类型判断!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值