JavaScript类型的检测

JavaScript有两种数据类型,基本类型和引用类型。

基本类型包括:数字,字符串,布尔值,undefined;

引用类型包括:Object,Array,RegExp。

用typeof可以基本上区分开基本类型和引用类型,除了null。

(function () {
	console.log(typeof 1); //number
	console.log(typeof 'kk'); //string
	console.log(typeof true); //boolean
	console.log(typeof undefined); //undefined
	console.log(typeof null); //object
	console.log(typeof {}); //object
	console.log(typeof []); //object
	console.log(typeof /\d/); //object
})();

因此,可通过下列代码区分基本类型与引用类型:

(function () {
	var test = 'test';
	var checkType = function (data) {
		if (typeof data === null) {
			return '基本类型';
		} else if (typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean' || typeof data === 'undefined') {
			return '基本类型';
		} else {
			return '引用类型';
		}
	};
	console.log(checkType(test)); //基本类型
})();

注:typeof检测正则表达式时,在safari5及chrome7以下版本返回function,这是因为ECMA-262规定任何内部实现call方法的对象都应该在应用typeof操作符时返回function。

区分开基本类型与引用类型后,也许我们还想从引用类型中找出不同值的对象,比如Object,Array,RegExp等,这就需要另一个操作符instanceof。它是根据对象的原型链来判断的:

(function () {
	var reg = new RegExp(),
			obj = {},
			arr = [];
	console.log(reg instanceof RegExp); //true
	console.log(obj instanceof Object); //true
	console.log(arr instanceof Array); //true
	console.log(function () {} instanceof Function); //true
})();

注:所有引用类型都是Object的实例,所以在检测一个引用类型值和Object构造函数时,都返回true。如:

console.log([] instanceof Object); // true

如果页面包含iframe,而且需要在iframe之间的变量进行类型判断,则需要采用下面的方法(因为iframe都拥有独自的window对象,而且引用类型也是各自独立的,所以上述方法无法正确识别数据类型):

(function () {
	// 判断类型
	var arr = [1, 2],
		reg = /\d/;
	function isArray(val) {
		return Object.prototype.toString.call(val) === '[object Array]';
	}
	function isFunction(val) {
		// 由于ie以COM形式实现函数,所以此函数不能在ie下不能正常使用
		return Object.prototype.toString.call(val) === '[object Function]';
	}
	function isRegExp(val) {
		return Object.prototype.toString.call(val) === '[object RegExp]';
	}
	function isNativeJSON(val) {
		// 判断是否为原生JSON对象
		return window.JSON && Object.prototype.toString.call(val) === '[object JSON]';
	}
	console.log(isArray(arr)); // true
	console.log(isFunction(function () {})); // true
	console.log(isRegExp(reg)); // true
	console.log(isArray(reg)); // false
	console.log(isNativeJSON(JSON)); // true
})();




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值