js数据类型检测

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cheng_cuo_tuo/article/details/86559273
<script>
/*
		使用typeof能够检测数据的类型,返回值是一个字符串,对于任何变量使用typeof进行检测,得到的只有六种类型,
	"number"、"string"、"boolean"、"object"、"function"、"undefined",但是对于null检测的结果是"object"
	检测null的一个好的方法是:
		function type(o){
			return (o == null)? "null" : "object";
		}
	
		typeof 不能检测比较复杂的数据类型,以及特殊用途的对象,比如正则表达式、日期类型、数学对象等。对于对象和数组
	可以使用constructor属性,该属性值引用的是原来的构造函数。也就是说返回的是一个函数。
	值(value)					typeof value	value.constructor
	var value = 1				"number"		Number
	var value = "a"				"string"		String
	var value = true			"boolean"		Boolean
	var value = {} 				"object"		Object
	var value = new Object()	"object"		Object
	var value = []				"object"		Array
	var value = new Array 		"object"		Array
	var value = function(){}	"function"		Function
	var value = className(){}	"object"		className
		
		使用constructor属性可以判断大部分数据的类型,但是,对于undefined和null特殊值,使用constructor属性,就会抛出异常。
	此时,可以先把值转换为布尔值,如果为true,则说明不是undefined和null值,然后再调用constructor属性
		数值直接量使用constructor需要将直接两用小括号括起来。
*/
	var value = undefined;
	alert(typeof(value));//undefined
	
	try {
		//出现异常:value is undefined
		alert(value.constructor);
	}
	catch (e) {
		alert("Error:" + e.message);	
	}
	
	alert(value&&value.constructor);
	
	var value = null;
	alert(typeof value);//object
	alert(value&&value.constructor);//null
	
	alert((10).constructor);//number
	alert(typeof((10).constructor));//function
</script>
<script>
/*
		使用toString()方法检测对象类型是最安全、最准确的方法。调用toString()方法将对象转换为字符串,然后通过检测字符串中
	是否包含数组所特有的标志字符可以确定对象的类型。
		toString()方法返回的字符串格式如下[object class],object表示对象的通用类型,class表示对象的内部类型,内部类型
	的名称和该对象的构造方法名称对应。
		class值提供的信息与对象的constructor属性值相似,但class值是以字符串的形式提供的,而不是以构造函数的形式提供的,
	所以在特定环境下非常有用。
		但是,要获取对象的class值的唯一方法是必须调用Object定义的默认的toString()方法,因为对象都会预定义自己的toString()
	方法,所以不能直接调用对象的toString()方法。例如,日期类Date的toString()方法,返回的是当UTC前时间的字符串形式。
		要调用Object对象定义的默认的toString()方法,可以先调用Object.prototype.toString对象的默认toString方法,
	在调用该函数的apply()方法在想要检测的对象上执行。
*/

/*
alert(typeof((10).constructor));//function

var d = new Date();
alert(d.toString());

var d = new Date();
var m = Object.prototype.toString;//这里的toString没有括号
alert(m.apply(d));//[Object Date]
*/

//比较完整的数据类型安全检测方法
//参数:o表示检测的值
//返回值:返回字符串"undefined","number", "boolean", "string", "function", "regexp", "array", "date",
//		"error", "object", "null"
function typeOf(o){
		var _toString = Object.prototype.toString;
		//获取对象的toString()方法
		//列举基本数据类型和内置对象类型,可以进一步补充数组的检测数据的范围
		var _type = {
				"undefined" : "undefined",
				"number" : "number",
				"boolean" : "boolean",
				"string" : "string",
				"[object Function]" : "function",
				"[object RegExp]" : "regexp",
				"[object Array]" : "array",
				"[object Date]" : "date",
				"[object Error]" : "error"
			}
		return _type[typeof(o)] || _type[_toString.apply(o)] || (o ? "object" : "null");
	}
	
var a = Math.abs;
alert(typeOf(a)); //function

</script>

猜你喜欢

转载自blog.csdn.net/cheng_cuo_tuo/article/details/86559273
今日推荐