CoffeeScriptJavaScript 数据类型判断

JavaScript
的数据类型分为两类:原始类型(基本类型)和目的类型(引用类型)。原始类型包含数字、字符串和布尔值,其余有多少个奇特的原始值:null
和 undefined,除此之外的都是目标。对象还包罗两种奇特的目标:数组和函数。

下边所有代码表明式假设重临值为 true 表示判断制造,否则不树立,变量
obj 表示要求看清的值。

通用方法

使用 typeof 运算符

判定数据类型可以应用 typeof
运算符,再次来到值是一个象征数据类型的字符串(注意是字符串,而且是小写的):

typeof 1             // 'number'
typeof 'abc'         // 'string'
typeof false         // 'boolean'
typeof undefined     // 'undefined'
typeof null          // 'object'
typeof {x: 1}        // 'object'
typeof [1, 2, 3]     // 'object'
typeof function() {} // 'function'

typeof 运算符可以使得判断数字、字符串、布尔值和 undefined
等原始类型,然而在直面数组和目的时就不能了。

借用 Object.prototype.toString() 方法

借用 Object.prototype.toString()
方法可以赢得一个象征对象的门类的字符串:

var toString = Object.prototype.toString;
toString.call('abc')    // '[object String]'
toString.call(true)     // '[object Boolean]'
toString.call([])       // '[object Array]'
toString.call({})       // '[object Object]'
toString.call(/./)      // '[object RegExp]'
toString.call(new Date) // '[object Date]'
toString.call(Math)     // '[object Math]'

接纳该方法可以使得判断数组、函数、日期、正则表达式等目标类型(引用类型)。在
ECMAScript 5 中还足以用这些点子来判定 null
undefined

toString.call(null)      // '[object Null]'
toString.call(undefined) // '[object Undefined]'

上面是一对奇异意况。

原始类型(基本类型)

数字

使用 typeof 运算符可以断定任意数字、NaN 或者 Infinity

typeof NaN      // 'number'
typeof Infinity // 'number'

比方要排除 NaNInfinity 可以行使 isFinite() 方法,不过
isFinite() 方法试图将一些非数字类型转换为数字,由此须求再行保障:

typeof obj === 'number' && isFinite(obj)

地点的表明式如若回到为 true 则保险了变量 obj 是数字类型的还要不是
NaN 或者
Infinity,毕竟大家不期望那四个新鲜数值插足数学运算。ECMAScript 6
增加的 Number.isFinite() 方法有一致效果。

整数

看清一个数是整数并且在安全限制内,利用整数取整后如故与自家相等的特性:

typeof obj === 'number' && isFinite(obj)
  && obj > -9007199254740992
  && obj < 9007199254740992
  && Math.floor(obj) === obj

NaN

全局的 isNaN()
方法也试图将有些非数字类型隐式转换为数字,如若转换成功,它会以为那一个值是一个数字,否则会觉得那是一个
NaN

isNaN(NaN)       // true
isNaN(0/0)       // true 0 除以 0 的结果为 NaN
isNaN('1')       // false 字符串 '1' 可以隐式转换为数字 1
isNaN(true)      // false 布尔值 true 可以隐式转换为数字 1
isNaN([])        // false 空数组可以隐式转换为数字 0
isNaN(Infinity)  // false
isNaN('abc')     // true
isNaN(undefined) // true

字符串 'abc'undefined
都不可以隐式转换为一个数字,所以被判定为是一个 NaN

NaN 是一个与众不一致数值,它不对等任何值,甚至不对等它和谐,因而断定一个值为
NaN 的最好办法是判断它是一个数字类型同时不等于我:

typeof obj === 'number' && obj != +obj

ECMAScript 6 增加的 Number.isNaN() 方法更好地解决了那个题材,唯有值为
NaN 的时候才会回去 true

Number.isNaN(NaN)        // true
Number.isNaN(Number.NaN) // true
Number.isNaN(0/0)        // true
Number.isNaN(Infinity)   // false
Number.isNaN('abc')      // false
Number.isNaN(undefined)  // false

可以观察 Number.isNaN() 方法和 isNaN()
方法是不平等的。Number.isNaN() 方法仅用于判断是不是是特殊值 NaN

布尔值

布尔值不是 true 就是 false,可以利用 typeof
运算符,也足以像上边那样判断:

obj === true || obj === false

Undefined

在 ECMAScript 3 中 undefined 是可读写的,所以从来与 undefined
作相比较再次回到的结果不肯定是精确的,像这么 var undefined = 1
在有点完成中是可以变动其值的,此时再与之做相比得到的结果就有点突然了,常常状态下如故利用
typeof 运算符来判断:

typeof obj === 'undefined'

唯独使用 typeof 运算符有一个不佳的地方是无法分别未定义的变量和值为
undefined 的变量(两者仍然有分其他),别的一种办法是选择 void
运算符,因为它的运算结果一连回到 undefined

obj === void 0

Null

使用 typeof 运算符判断 null 将会回到
'object',那肯定不是想要的,所以最好的章程是一贯与 null 值进行相比较:

obj === null

那里不可不利用 ===,因为 undefined == null 也会回来 true

存在判断

对值为 nullundefined
的变量读取属性时会引发错误,由此有时候需求做存在判断,简单地利用 if
语句来判断,会将这一个可以隐式转换为 false
的值也一概排除掉了,比如数字0、空字符串、空数组(那里有个谬误,空数组单独放在
if 语句里面将会更换为 true,而作相比的时候是与 false 相等的,比如 []
== false)之类的,它们都可以隐式转换为 false,因为 undefined == null
会返回 true,而和其余任何非 null 或者 undefined 的值比较都会回去
false,所以更好的措施是直接与 null 值做相比:

if (obj != null) {
  obj.property;
}

如此就可以看清变量 obj 既不是 undefined 也不是
null,或者像下边那样判断:

typeof obj !== 'undefined' && obj !== null

通过存在判断才得以放心使用 . 语法获取属性。

对象类型(引用类型)

对象

要区别 null 和其余对象可以像下边那样判断,因为 null 值可以隐式转换为
false

obj && typeof obj === 'object'

如此判断就足以把 null 给消除掉,变量 obj
是对象或者数组或者其它对象(不蕴含函数)。上面是其余一种办法:

obj === Object(obj)

使用 Object()
方法若是传入的参数不是目的将会被撤换为对象,否则,只是简短地将盛传的参数重临。该方法可以断定所有目的,包蕴函数。

数组

看清数组的点子:

Object.prototype.toString.call(obj) === '[object Array]'

ECMAScript 5 增添了数组检测的原生方法:

Array.isArray(obj)

函数

虽然 typeof 运算符将函数更加对待了,但是利用 typeof
运算符在稍微完毕中不是函数的也会回来
'function',由此如故选拔如下方法来判定函数:

Object.prototype.toString.call(obj) === '[object Function]'

正则说明式

使用 typeof 运算符判断正则表明式,一般都会回到
'object',然而也有一部分兑现会回去 'function',所以,如故借用
Object.prototype.toString 方法来判定:

Object.prototype.toString.call(obj) === '[object RegExp]'

参考资料