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数据类型检测_封装一个数据类型检测的方法库
参考技术AJS中的数据类型分为三大类:
数据类型检测四种方式
语法: 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数据类型检测的主要内容,如果未能解决你的问题,请参考以下文章