实际中经常会用到判断一个变量是什么数据类型,在此做了下总结
基本数据类型
在javaScript中有5种原始类型(ES6之前):string, number, boolean, null, undefind
,基本数据类型的判断,最佳选择是使用typeof
运算符,它会返回一个字符串类型的值。
- 对于字符串,typeof 返回
"string"
- 对于数字,typeof 返回
"number"
- 对于布尔值,typeof 返回
"boolean"
- 对于undefind,typeof 返回
"undefind"
// 检测字符串
if (typeof name === 'string') {
// some code
}
// 检测数字
if (typeof count === 'number') {
// some code
}
// 检测布尔值
if (typeof found === 'boolean' && found) {
// some code
}
// 检测布尔值
if (typeof app === 'undefind') {
// some code
}
typeof 运算符独特之处在于,即使是未定义的变量也不会报错,也就是说,未定义的变量和值为undefind的变量通过typeof都将返回"undefind"
.
但是对于最后一个原始类型null
, 不能用typeof来进行判断,因为 typeof null === 'object'
, 但是其实一般null不应用于检测语句,值为null的变量一般不是生成的,但是如果你所期望的值真的是null,则可以直接进行比较:
var element = document.getElementById('box');
if (element !== null) {
// some code
}
引用类型数据
引用值也称作对象(object),在js中除了原始类型之外的值都是引用类型,有这么几种内置的引用类型:Object,Array,Date,Error,RegExp。使用typeof运算符都会返回'object'.
instanceof
检测引用类型数据的最简单的方式是使用instanceof
运算符
// 检测日期对象
if (value instanceof Date) {}
// 检测正则表达式对象
if (value instanceof RegExp) {
console.log(value.test(anotherVal))
}
// 检测Error
if (value instanceof Error) {
throw value;
}
instanceof不仅检测这个对象的构造函数,还会检测原型链,因此每个对象的 value instanceof Object
都会返回true,所以使用instanceof来判断对象是否属于某个特定类型的做法并非最佳。
constructor
另外一个方法就是直接判断对象的构造函数,经常在实际应用中会判断一个对象是不是数组类型
if (arr.constuctor === Array ) {
console.log('array');
} else if (arr.constuctor === Object ) {
console.log('object');
}
另外检测一个对象是不是数组还有一个ES5中的方法 Array.isArray()
.
Object.prototype.toString.call()
调用某个值的tostring 方法在所有浏览器中都会返回标准的字符串结果,因此可以用来判断某个特定类型的对象
Object.prototype.toString.call(arr) === '[object Array]'; // 数组
Object.prototype.toString.call(arr) === '[object Object]'; // 对象
Object.prototype.toString.call(arr) === '[object RegExp]'; // 正则
Object.prototype.toString.call(arr) === '[object Date]'; // 日期
检测对象的属性
判断属性是否存在的最好的方法是使用in运算符,in运算符仅仅会简单的判断属性是否存在,而不会去读取属性的值
if ('name' in object) {
// some code
}
但是in运算法不仅会检测实例对象的属性是否存在,还会检测原型链上属性是否存在,如果你只想检测实例对象的某个属性是否存在,则要使用hasOwnProperty()
方法。这个方法只会检测实例对象的属性是否存在,而不会去检测原形链上的属性。
if (object.hasOwnProperty('name')) {
// some code
}
检测函数
从技术上讲,js中的函数都是引用类型,同样存在Function构造函数,每个函数都是其实例。检测函数最好的方法是使用typeof运算符。
function myFunc(){}
console.log(typeof myFunc === 'function') // true