在JavaScript中,“空”有多种含义,一般包含以下几种情形:
1、undefined(未初始化)
2、null(对象型)
3、NaN(数值型)
4、""(字符串)
5、仅包含空格(以及TAB字符等)的字符串
所以,对JavaScript中值为“空”的判断不能是简单的:
if(typeof(value) =undefined || value=""){
alert('Empty!');
}
1、恰当的非空判断处理方式
最严谨的做法是先判断数据类型,然后根据值的类型来判断,然后根据不同的类型做不同的处理。
1、未初始化--->判断类型是否为undefined
2、对象型--->判读是否为null
3、数值型--->判断是否为NaN
4、字符串型--->判断是否为"",以及判断是否包含空白字符(匹配正则表达式/\s+/)
//判空函数
function isEmpty(value){
if(value == undefined //未初始化的判断
|| value == null //object类型的判断
|| (typeof(value) == 'string' && (value == ''|| value.match(/\s+/)))
|| (typeof(value) == 'number' && isNaN(value))){
return true;
}
return false;
}
2、常见处理存在的问题
2.1 或运算
一般对空串的处理,有人常采用或运算:
var value=something;
value = value || '';
这种做法是假设变量str是undefined或null,就用''代替,但是若value的值为数值0或布尔值false,则也会被替换空串,这往往不是我们想要的。
2.2 仅做undefined类型判断
还有的人使用typeof(value)==undefined进行判断,如果不为undefined,则使用valure ==""来判断是否为空,实际上也是有问题的,0=="",false==""均返回true,详见下面的实验。
实验参考:
<script lang="javascript">
//undefined与空串做或运算,返回空串
function test1(){
var a ={};
alert(a.tmp);
var str = a.tmp || '';
alert(str);
}
//0和false与空串做或运算时不返回空串
function test2(){
var a = 0;//false
var str = a || '';
alert(str);
}
//0等于空串,false等于空串
function test3(){
alert('0==\'\':' + (0==''));
alert('false==\'\':' + (false==''));
}
//类型测试
function test4(){
var a;
alert(a +' type is:' + (typeof a));
a = 0;
alert(a +' type is:' + (typeof a));
a = false;
alert(a +' type is:' + (typeof a));
a = '';
alert(a +' type is:' + (typeof a));
a = null;
alert(a +' type is:' + (typeof a));
var toFloat;
a = parseFloat(toFloat);
alert(a +' type is:' + (typeof a));
}
//判空函数
function isEmpty2(str){
if(str==undefined || str==null || str==='' || isNaN(str) || str.match(/\s+/)){
return true;
}
return false;
}
//判空函数
function isEmpty(value){
if(value == undefined //未初始化的判断
|| value == null //object类型的判断
|| (typeof(value) == 'string' && (value == ''|| value.match(/\s+/)))
|| (typeof(value) == 'number' && isNaN(value))){
return true;
}
return false;
}
//判空函数测试
function test5(){
var a;
alert('a value:' + a + ',judge:' + isEmpty(a));
a = 0;
alert('a value:' + a + ',judge:' + isEmpty(a));
a= false;
alert('a value:' + a + ',judge:' + isEmpty(a));
var toFloat;
a=parseFloat(toFloat)
alert('a value:' + a + ',judge:' + isEmpty(a));
}
test5();
</script>