js数据类型检测

Posted _聪明勇敢有力气

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js数据类型检测相关的知识,希望对你有一定的参考价值。

数据类型检测

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;
)();

2. JS数据类型检测_封装一个数据类型检测的方法库

参考技术A

JS中的数据类型分为三大类:

数据类型检测四种方式

语法: typeof [value]

基于 typeof检测结果

@优势
使用方便,所以在真实项目中,我们也会大量应用它来检测,尤其是在检测基本类型值(除null之外)和函数类型值的时候,它还是很方便的

@局限性
1、 typeof null => “object” , 但是null 并不是对象,是空指针对象;
2、无法细分当前值是普通对象还是数组对象等, 如: 是正则 还是数组
因为只要是对象数据类型,返回的结果都是"object";

语法: [实例] instanceof [类]

@局限性:

1、不能处理基本数据类型值
2、只要在当前实例的原型链( proto )中出现过的类,检测结果都是true(用户可能会手动修改原型链的指向:example.proto 或者 在类的继承中 等情况)

@原理
在类的原型上一般都会带有CONSTRUCTOR属性,存储当前类本身,我们也是利用这一点,获取某实例的CONSTRUCTOR属性值,验证是否为所属的类,从而进行数据类型检测

@局限性
可以去随意修改对应的constructor值或者是手动给ary增加一个私有的constructor属性等;

"[object 所属类]" ,例如:"[object Array]"...

**所有的数据类型上都有toString方法,只有Object原型上的toString是检测当前实例所属类的详细信息的,其它原型的方法仅仅是转换为字符串;

@原理

1.首先基于原型链查找机制,找到Object.prototype.toString
2.把找到的方法执行,方法中的this -> obj
3.方法内部把this(obj)的所属类信息输出
=>方法执行,方法中的this是谁,就是检测谁的所属类信息

@优势

所有数据类型隶属的类信息检测的一清二楚
String/Boolean/Null/Undefined/Symbol/Object/Array/RegExp/Date/Math/Function...

结合每个方法,属性的优缺点,我们来封装一个简单的检测数据类型库:

以上是关于js数据类型检测的主要内容,如果未能解决你的问题,请参考以下文章

前端最强面试宝典 - JS 篇之数据类型

走进前端——JavaScript_类型检测

前端JavaScript面试技巧

前端知识体系-JS相关深入理解JavaScript原型(继承)和原型链

前端面试题

前端开发Javascript中重难知识点常见问题集合