Javascript返回NaN

csm*_*32s 8 javascript jquery parsing

每次客户输入数量时,我都会尝试显示小计.但是,当我循环输入时,我得到一个NaN总数.我相信它可能是我subtotal在我的脚本中声明变量的方式,但我之前没有遇到过这个:

$('.item-qty input').bind('keyup', function(){

   var subtotal = 0.0;

   $('.item-qty input').each(function(){
      var class = $(this).attr('id');
      var qty = $(this).val();                     
      var price = $('.'+class).html();

      price = parseFloat(price);
      qty = parseInt(qty);
      subtotal = subtotal + (price * qty);
   });

   $('.subtotal input').val(subtotal);
});
Run Code Online (Sandbox Code Playgroud)

Bry*_*ard 23

parseFloat如果字符串的第一个字符无法转换为数字,则parseInt可以返回NaN.

所以,我会像这样保护它(NaN是一个虚假的价值):

price = parseFloat(price) || 0;
qty = parseInt(qty, 10) || 0;
Run Code Online (Sandbox Code Playgroud)

对具有该值的数字的算术运算NaN几乎总是导致NaN(NaN + 5将导致NaN.)这意味着,如果只有一个输入无法被parseFloat或解析parseInt,则您当前的代码将最终计算NaN小计.


它已在评论中提及(主要由Felix提及),但我认为值得强调,因为这些是重要的问题:

  • 始终将radix参数传递给parseInt函数;
  • 不要class用于变量名:它是保留(未使用但保留)的关键字;
  • 除非你以美分计算,否则不要指望小计是完全准确的.

  • 不是'NaN + 5 === NaN`的情况,因为`NaN`是[与自身不相同]的一个值(http://stackoverflow.com/questions/1565164/what-is-the-理由对所有人 - 比较 - 返回假换IEEE754楠值).也许`isNaN(NaN + 5)`会更好. (2认同)