前言
在web应用中类型判断很常用,例如基于Javascript的基本数据类型string、number的判断,基于复杂数据类型对象和数组的判断等等,还有更复杂的例如plainObject、空对象、window对象等。
类型判断的几种方式
Javascript中的数据类型:基本数据类型(Null、Undefined、String、Number、Boolean、Symbol)和复杂数据类型(Object、Array、Date、Function、RegExp、Error等)
- typeof
- instanceof
- constructor
- Object.prototype.toString.call()
- 判断数组有特有的:Array.isArray
两种常用于数据类型判断的方法
- typeof
Object.prototype.toString
typeof
** **能辨别: 基本数据类型:Number、String、Boolean、Undefined,复杂类型:Function。
不能辨别: Null和除Function之外的其他复杂数据类型
typeof undefined //"undefined"typeof 2 //"number"typeof "youyi" //"string"typeof true //"boolean"typeof Symbol() // "symbol"typeof b //"undefined" 需要注意未申明的变量也会类型判断为undefined
Object.prototype.toString
可以辨别出所有的类型
var number = 1; // [object Number]var string = '123'; // [object String]var boolean = true; // [object Boolean]var und = undefined; // [object Undefined]var nul = null; // [object Null]var obj = {a: 1} // [object Object]var array = [1, 2, 3]; // [object Array]var date = new Date(); // [object Date]var error = new Error(); // [object Error]var reg = /a/g; // [object RegExp]var func = function a(){}; // [object Function]var window = window; //[object Window]var location = location; //[object Location]function checkType() {for (var i = 0; i < arguments.length; i++) {console.log(Object.prototype.toString.call(arguments[i]))}}checkType(number, string, boolean, und, nul, obj, array, date, error, reg, func,window,location)
封装判断Js数据类型的方法
满足以下条件:
1、IE6下Null、Undefined会被Object.prototype.toString.call转换成[object Object]的情况
2、对于Js数据类型判断,返回对应类型的小写字符串
var typeMaps = {}
"Boolean Number String Function Array Date RegExp Object Error".split(' ').map(item=> {
typeMaps["[object "+item+"]"] = item.toLowerCase()
})
function type(obj) {
if(obj == null) { //undefined == null为true;'' == null 为false;
return obj + ''
}
return typeof obj === "object" || typeof obj === "function" ? typeMaps[Object.prototype.toString.call(obj) ] || Object : typeof obj;
}
额外补充关于“==”比较两个值是否相等的问题
| 类型 | Number | String | Null | Undefined | |
|---|---|---|---|---|---|
| Number | |||||
| String | 字符串先转数字再比较 | ‘’ == null 不相等 |
|||
| Null | 总不相等 | 相等 | 相等 | ||
| Undefined | 总不相等 | 相等 | 相等 | ||
| Boolean | 布尔值转数字再比较 |
