3
回答
吐槽一下JavaScript中的0
【腾讯云】学生服务器套餐10元/月 >>>   

当你在JavaScript中用可能为0的变量做if判断时要小心了。例如我在做财务系统是经常跟数字打交道,系统就有段类似这样的代码,客户反应price没有空的但显示为空:

if(price!=null && price!='' && price!=undefined) {
    price = Math.round(price*100)/100;
} else {
    price = '';
}



这里debug发现,当价格为0的时候,就会显示为空。0在JavaScript中为false一直知道,但没想到0==''竟然是true,这有点坑,不过JavaScript有==和===的分别,0==''也解释的过去

所以比较简单的方式是:

if(price || price==0) {
    // TODO
} else {
    // TODO
}



当然系统的这段老代码本身也有问题,关于数字的判断怎么能忘了它呢?
if(!isNaN(price)) {
    // TODO
} else {
    // TODO
}






举报
共有3个评论 最后回答: 1年前
很明显这是进行了自动类型转换,那究竟是怎么转换的呢?根据《javascript权威指南》,第四章表达式与运算符第4.9节第75页,==比较时如果两边的数据类型不一致会尝试进行类型转换,如果一个值是数字一个值是字符串,则会把字符串转换为数字,而第三章第3.8节第49页列举了一些让人倍感意外的类型转换,空字符串"",false会被转换成0,虽然parseInt是NaN。

少用不等于(!= 、!==)判断,尤其是多个不等于条件时非常容易混淆!

price = +price;
if ( ! isNaN(price)) { // 数字,数字字符串,bool, ''都满足
 // 数字
}
else {
 // 非数字
}

或者这样:


price = parseInt(price, 10);
if ( ! isNaN(price)) { // 数字字符串,数字, 0 满足
}
else { // undefined, boole, '' 满足
}


或者这样:

if (price || price === 0) { // 字符串(内容为数字或者字母),数字,数字0,true 满足
  if ( ! isNaN(price)) {
  }
}
else { // false, undefined, '' 满足
}






引用来自“二环南路上的狂奔”的评论

很明显这是进行了自动类型转换,那究竟是怎么转换的呢?根据《javascript权威指南》,第四章表达式与运算符第4.9节第75页,==比较时如果两边的数据类型不一致会尝试进行类型转换,如果一个值是数字一个值是字符串,则会把字符串转换为数字,而第三章第3.8节第49页列举了一些让人倍感意外的类型转换,空字符串"",false会被转换成0,虽然parseInt是NaN。
JavaScript这种弱类型,然后自动进行转换,有时候真的让人很无语。例如我有个变量a在后台数据对应的是number类型,获取改数据赋值给js后,我有这样一个操作对字段做长度判断,超长了就截断增加\n。因为从前端来说我并不知道该数据的类型,然后我调用a.length()判断长度,始终不对。因为如果是number类型是不能用length()来判断的,必须a.toString().length()这样就没问题了。这种若类型的设计很多时候得不偿失!
顶部