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
})();