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