JS中的数据类型
七中内置类型
- 空值(null)
- 未定义(undefined)
- 布尔值(boolean)
- 数字(number)
- 字符串(string)
- 对象(object)
- 符号(symbol,ES6新增)
六种基本类型
除object外,其他六种为基本类型
JS中数据类型检测的几种方法
- typeof
底层机制:直接在计算机底层基于数据类型的值(二进制)进行检测
缺点1:typeof null为“object”
原因:在计算机中对象存储都是以000开头的二进制存储,null也是,所以用typeof检测null的类型为“object”
缺点2:typeof 普通对象/数组对象/正则对象/日期对象都是“object”
- instanceof 检测当前实例是否属于这个类
底层机制:只要当前类出现在实例的原型链上,结果都为true
缺点1:可以人为肆意修改原型的指向,因此检测结果并不准确
缺点2:不能检测基本数据类型
- consttructor
可以支持基本数据类型检测
缺点:constructor也可以随意更改,结果也不准确
- Object.prototype.toString.call()
标准检测数据类型的方法,此方法不是转换为字符串,而是返回当前实例所属类的信息
可以检测的类型包括
“[object Number/String/Boolean/Null/Undefined/Symbol/Object/Array/RegExp/Date/Function]”
总结
最理想的检测数据类型的方法是结合typeof和Object.prototype.toString.call()
(function () {
var class2type = {};
var toString = class2type.toString; //=>Object.prototype.toString
// 设定数据类型的映射表
["Boolean", "Number", "String", "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;
})();