/*
* 数据类型检测:
* 1. typeof
* 这里直接在计算机底层基于数据类型的值(二进制)进行检测
* tyepof null "object" 对象存储在计算机中,都是以000开始的二进制存储,null也是,所以检测出来的结果是对象
* typeof 普通对象/数组对象/正则对象/日期对象 "object"
*
* 2. instanceof 检测当前实例是否属于这个类的
* 底层机制:只要当前类出现在实例的原型链上,结果是true
* (ps:可以随意的修改原型的指向,所以检测出来的结果不够准确不能检测基本数据类型)
*
* 3. constructor
* 用起来看似比instanceof还好用一些(基本类型支持的)
* constructor可以随便改,所以也不准
*
* 4. Object.prototype.toString.call([value])
* 标准检测数据类型的办法:Object.prototype.toString不是转换为字符串,是返回当前实例所属类的信息
* 标准检测的办法 "[object Number/String/Boolean/Null/Undefined/Symbol/Object/Array/RegExp/Date/Function]"
*/
### 如何封装一个准确的数据类型检测方法,如下
(function () {
var classTotype = {};
var toString = classTotype.toString; //=>Object.prototype.toString
// 设定数据类型的映射表
["Boolean", "Number", "String", "Function", "Array", "Date", "RegExp", "Object", "Error", "Symbol"].forEach(name => {
classTotype[`[object ${name}]`] = name.toLowerCase();
});
function toType(obj) {
if (obj == null) {
// 传递的值是null或者undefined,就返回对应的字符串
return obj + "";
}
// 基本数据类型都采用typeof检测
return typeof obj === "object" || typeof obj === "function" ?
classTotype[toString.call(obj)] || "object" :
typeof obj;
}
window.toType = toType;
})();