js数据类型检测

文章详细介绍了JavaScript中用于检测数据类型的几种方法,包括typeof、instanceof和constructor,以及如何使用Object.prototype.toString.call来获取更标准的数据类型信息。同时,文章指出了这些方法的局限性和准确性问题,并提供了一个封装的toType函数作为解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据类型检测

typeof

  • 直接在计算机底层基于数据类型的值(二进制)进行检测
  • typeof null “object” 对象存储在计算机中 都是以000开始的二进制存储 null也是 所以检测出来的结果是对象
  • typeof 普通对象/数组对象/正则对象/日期对象 “Object”

instanceof

检测当前实例是否属于这个类的

  • 底层机制:只要当前类出现在实例的原型链上 结果都是true
  • 由于我们可以肆意的修改原型的指向 所以检测出来的结果是不准的
  • 不能检测基本数据类型
let arr = []
console.log(arr instanceof Array) //true
console.log(arr instanceof RegExp) //false
console.log(arr instanceof Object) //true
let n = 1
console.log(n instanceof Number) //false
function instance_of(example, classFunc){
	let classFuncPrototype = classFunc.prototype,
	proto = Object.getPrototypeOf(example);
	while(true) {
		if(proto === null){
			reutrn false
		}
		if(proto === classFuncPrototype){
			return true
		}
		proto = Object.getPrototype(proto)
	}
}

constructor

  • 用起来看似比instanceof还好用一些(基本类型支持)
  • constructor可以随便改 所以也不准
let arr = []
console.log(arr.constructor === Array) //true
console.log(arr.constructor === RegExp) //false
console.log(arr.constructor === Object) //false
let n = 1
console.log(n.constructor === Number) //true

Object.ptototype.toString.call([value])

  • 标准检测数据类型的方法:Object.prototype.toString不是转换为字符串 是返回当前实例所属类的信息
  • 标准检测的方法 “[object Number/String/Boolen/Null/Undefind/Symbol/Object/Array/RegExp/Date/Function]”
let obj = {
	name:'gh'
}

//obj.toString() => '[object Object]'
//-> toString方法执行 this是obj 所以检测是obj它的所属类信息
//推测:是不是只要把Object.prototype.toString执行 让它里面的this变为要检测的值 那就能返回当前值所属类的信息

封装判定类型的方法

(function () {
	var class2Type = {};
	var toString = class2Type.toString; //Object.prototype.toString
	// 设定数据类型映射表
	[
		"Boolean",
		"String",
		"Number",
		"Function",
		"Array",
		"Date",
		"RegExp",
		"Object",
		"Error",
		"Symbol",
	].forEach((name) => {
		class2Type[`[object ${name}]`] = name.toLowerCase();
	});

	function toType(obj) {
		if (obj == null) {
			// 传递的值是null或undefined 就返回对应的额字符串
			return obj + "";
		}
		// 基本数据类型都采用typeof检测
		return typeof obj === "object" || typeof obj === "function"
			? class2Type[toString.call(obj)] || "object"
			: typeof obj;
	}
	window.toType = toType;
})();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_聪明勇敢有力气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值