前言
在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 | 布尔值转数字再比较 |