JavaScript 数据类型判断
2014-12-06 11:25
507 查看
原文:JavaScript 数据类型判断JavaScript 的数据类型分为两类:原始类型(基本类型)和对象类型(引用类型)。原始类型包括数字、字符串和布尔值,另外有两个特殊的原始值:null 和 undefined,除此之外的都是对象。对象还包括两种特殊的对象:数组和函数。
下面所有代码表达式如果返回值为
使用该方法可以有效判断数组、函数、日期、正则表达式等对象类型(引用类型)。在 ECMAScript 5 中还可以用这个方法来判断
和
下面是一些特殊情况。
如果要排除
上面的表达式如果返回为
字符串
ECMAScript 6 增加的
可以看出
不过使用
这里必须使用
这样就可以判断变量
通过存在判断才可以放心使用
这样判断就可以把
使用
ECMAScript 5 增加了数组检测的原生方法:
CoffeeScript The Existential Operator
MDN 关于 Object.prototype.toString() 方法的说明
MDN 关于 Number.isInteger() 方法的说明
Javascript – MAX_INT: Number Limits by Vjeux
下面所有代码表达式如果返回值为
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'
如果要排除
NaN和
Infinity可以使用
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。
存在判断
对值为null或
undefined的变量读取属性时会引发错误,因此有时候需要做存在判断,简单地使用
if语句来判断,会将那些可以隐式转换为
false的值也一概排除掉了,比如数字0、空字符串、空数组之类的,它们都可以隐式转换为
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]'
参考资料
Underscore.js 对象方法CoffeeScript The Existential Operator
MDN 关于 Object.prototype.toString() 方法的说明
MDN 关于 Number.isInteger() 方法的说明
Javascript – MAX_INT: Number Limits by Vjeux
相关文章推荐
- JavaScript数据类型判断
- javascript 判断是否为数组或对象或各种其它数据类型
- javascript 简单高效判断数据类型
- javascript 简单高效判断数据类型系列函数 (转) By shawl.qiu
- WEB前端学习 Day 6(Javascript 初识+变量+逻辑判断+数据类型)
- JavaScript数据类型判断--使用toString方法
- javascript判断数据类型
- JavaScript中判断数据类型
- javascript数据变量类型判断(JS变量是否是数组,是否是函数的判断)
- javascript判断数据类型
- JavaScript数据类型及判断方法
- JavaScript学习——判断数据类型总结(转)
- 判断JavaScript的数据类型
- 关于JavaScript的变量的数据类型的判断方法
- javascript 简单高效判断数据类型 系列函数 By shawl.qiu
- JavaScript判断数据类型总结
- 关于 JavaScript 数据类型判断
- javascript 简单高效判断数据类型系列函数
- javascript -- 判断是否为某个数据类型
- javascript数据类型和判断数据类型