js中判断各种数据类型

964 阅读3分钟

实际中经常会用到判断一个变量是什么数据类型,在此做了下总结

基本数据类型

在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