1、typeof关键字
- 返回一个字符串,作用于基本数据类型
- 直接在计算机底层基于数据类型的值(二进制) 进行检测。
- typeof null "object" 对象存储在计算机中,都是以000 开始的二进制存储,null也是,所以检测出来的结果是对象。
- typeof 普通对象/数组对象/正则对象/日期对象 "object"
2、instanceof 关键字
- 返回一个布尔值 ,左边是 检测对象 右边是判断的类型 class
- 底层机制:只要当前类出现在实例的原型上,结果都是 true
- 由于我们可以肆意的修改原型的指向,所以检测的结果不准的
- 不能检测基本数据类型
arr instanceof Array ==>true
arr instanceof RegExp == >false
arr instanceof Object ==> true
1 instanceof Number ==> false
javascript
// 实例.__proto__ === 类.prototype
function instance_of(ex,cl) {
let classFunP = cl.prototype,
proto = ex.getPrototypeOf(ex);
while(true) {
if(proto === null) {
return false;
}
if( proto === classFunP ) {
return true;
}
proto = Object.getPrototypeOf(proto);
}
}
3、constructor属性
- 用起来看似比instanceof 还好用一些(基本类型支持的)
- constructor可以随便改,所以也不准。
arr.constructor == Array // true
arr.constructor == RegExp // false
arr.constructor == Object // false
1.constructor == Number // true
4、Object.prototype.toString().call([value])
- 标准检测数据类型的方法:Object.prototype.toString 不是转换为字符串,是返回当前实例所属类的信息。
- 标准的检测的方法 "[object Number/String/Boolean/Null/Undefined/Symbol/Onject/Array/Regexp/Date]"
最后总结的封装的方法
javascript
const defaultTypeMap = {
"object Number": "number",
"object String": "string",
"object Boolean":"boolean",
"object Array": "array",
"object Object": "object",
"object Date": "date",
"object Function": "function",
"object Error": "error",
"object RegExp": "regExp",
"object Symbol": "symbol",
}
function typeCheck(value) {
// 如果是null 或者 undefined 直接返回
if(value == null) {
return value + "";
}
const toString = Object.prototype.toString;
return typeof value == "object" || typeof value == "function" ? defaultTypeMap[toString.call(value)] || "object": typeof value;
}