在js中数据类型有N种,这里我们来介绍常用的数据类型判断方法,这里包括有:数值型(Number)。包括整数、浮点数、布尔型、字符串型、数组、空值、Undefined等等
先来看一个我面试的题
上周面试的时候,考官问我 js如何判断一个变量的数据类型是数组,js中的typeof是不能区分 Array 和 Object 的,这是js的一个问题。也就是说:
typeof [] == 'object'; //true判断数组的方法如下:(太长换行,大家将就看)
代码如下 |
|
if(a&&typeof a == 'object'&&typeof a.length == 'number'&&
!a.propertyIsEnumerable('length')))
{
alert("a是数组");
}
|
好了不知道大家看懂了,没看懂接着下看。
一、JS中有哪些数据类型。
1.数值型(Number)。包括整数、浮点数。
2.布尔型(Boolean)。
3.字符串型(String)。
4.对象(Object)。
5.数组(Array)。
6.空值(Null)。
7.未定义(Undefined)。
二、判断一个变量属于什么数据类型。
1.数值型(number)。
比较常用的判断方法是
代码如下 |
|
function isNumber(val)
{
return typeof val === 'number';
}
|
但有些情况就不行。比如
var a;
document.write(isNumber(parseInt(a)));
这里打印出来的是true,但实际上变量a是NaN,它是不能用于数值运算的。
所以上面的函数可以修改为
代码如下 |
|
function isNumber(val)
{
return typeof val === 'number' && isFinite(val);
}
|
isFinite() 函数是js自带的,它会过滤掉NaN和Infinity。
另外,判断变量是否是NaN,可以用isNaN(),它返回布尔值。
2.布尔型(boolean)、 字符串型(string) 和未定义(Undefined)。
这3个类型 比较简单,直接用
代码如下 |
|
typeof val === ‘boolean’
typeof val === ‘string’
typeof val === ‘undefined’
|
就可以了。
3.对象(Object)和 空值(Null)。
由于当变量是空值Null时,typeof也会返回object,所以Object不能直接用
typeof 判断。应该这样
代码如下 |
|
function isObj(str)
{
if(str === null || typeof str === 'undefined')
{
return false;
}
return typeof str === 'object';
}
|
判断空值用 val === null 即可。注意要用全等。
4.数组(Array)。
数组类型不可用typeof来判断。因为当变量是数组类型是,typeof会返回object。
这里有两种方法判断数组类型。
代码如下 |
|
function isArray(arr)
{
return Object.prototype.toString.apply(arr) === '[object Array]';
}
//或
function isArray(arr)
{
return arr.constructor === Array;
}
|
下面再分享一些常用的验证数据类型的函数
代码如下 |
|
**********************一。验证类*****************************/
//对象是否存在
function isObj(str)
{
if(str==null||typeof(str)=='undefined')
return false;
return true;
}
//去除字符串中的空格
function strTrim(str)
{
if(!isObj(str))
return 'undefined';
str=str.replace(/^/s+|/s+$/g,'');
return str;
}
/**********************1数字验证******************************/
//1。1整数
//整数或者为空
function isIntOrNull(str){
if(!isObj(str))//判断对象是否存在
return 'undefined';
return isNull(str)||isInt(str);
}
//必需是整数
function isInt(str){
var reg = /^(-|/+)?/d+$/ ;
return reg.test(str);
}
//1.2小数
//小数或者为空
function isFloatOrNull(str){
if(!isObj(str))//判断对象是否存在
return 'undefined';
if(isInt(str))
return true;
return isNull(str)||isFloat(str);
}
//必需是小数
function isFloat(str){
if(isInt(str))
return true;
var reg = /^(-|/+)?/d+/./d*$/;
return reg.test(str);
}
//1.3数字大小判断
//数i不能大于数y
function iMinY(i , y){
if(!isObj(i)||!isObj(y))//判断对象是否存在
return 'undefined';
if(!(isFloat(i)&&isFloat(y)))
return '比较的必须是数字类型'
if(i<=y)
return true;
return false;
}
//数i不能小于数y
function iMaxY(i , y){
if(!isObj(i)||!isObj(y))//判断对象是否存在
return 'undefined';
if(!(isFloat(i)&&isFloat(y)))
return '比较的必须是数字类型'
if(i>=y)
return true;
return false;
}
/**********************1数字验证******************************/
/**********************2时间类验证******************************/
//2.1 短时间,形如 (13:04:06)
function shortTimeCheck(str)
{
if(!isObj(str))//判断对象是否存在
return 'undefined';
var a = str.match(/^(/d{1,2})(:)?(/d{1,2})/2(/d{1,2})$/);
//var a = str.match(/^/d{1,2}:/d{1,2}:/d{1,2}$/);
if (a == null)
{
alert("输入的参数不是时间格式");
return false;
}
if (a[1]>24 || a[3]>60 || a[4]>60)
{
alert("时间格式不对");
return false
}
return true;
}
//2.2 短日期,形如 (2003-12-05)
function shorDateCheck(str)
{
var r = str.match(/^(/d{1,4})(-|//)(/d{1,2})/2(/d{1,2})$/);
if(r==null)
return false;
var d= new Date(r[1], r[3]-1, r[4]);
return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
}
//2.3 长时间,形如 (2003-12-05 13:04:06)
function longDateCheck(str)
{
var reg = /^(/d{1,4})(-|//)(/d{1,2})/2(/d{1,2}) (/d{1,2}):(/d{1,2}):(/d{1,2})$/;
var r = str.match(reg);
if(r==null)
return false;
var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
}
//2.4 只有年和月。形如(2003-05,或者2003-5)
//2.5 只有小时和分钟,形如(12:03)
|