isNaN() javascript, 带 2 个逗号的数字

isNaN() javascript, number with 2 commas

我正在使用百分比和 setInterval() 所以我有一个

    var intervalId;
    function randomize(){
       var prc = $("#prc").val();
       var c = 0 ;
       if (!intervalId){
          intervalId = setInterval(function(){
              c = c + 1;
              var attempt = Math.random() * 100;
              if (attempt <= prc){
                  clearInterval(intervalId);
                  intervalId = false;
                  $("#attemptnbr").val(c);
              }
          }, 100);
       }
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

Percentage : <input type="text" id="prc"/>
<button onclick="randomize()">GO</button>
Number of attempts :<input type="text" id="attemptnbr"/>

但实际上如果用户将 #prc 输入设置为 50.345.34attempt <= prc 条件总是 returns true。 当此输入设置为 50.345.34 之类的数字时,我尝试 console.log(isNaN(prc)),它总是 returns false

为什么它被认为是一个数值?

因为$("#prc").val()returns一个字符串。 50.345.34 是一个字符串。 当你比较字符串和数字时,js会比较字符串长度和数字值。

But actually if the user set the #prc input to 50.345.34, the attempt <= prc condition always returns true.

很确定这是观察错误。您的 prc 是一个字符串,然后 <= 运算符会将其隐式转换为数字。该数字将为 NaN,因为“50.345.34”无法隐式转换,并且使用 NaN 的关系永远不会为真。

然而,它并没有真正改变你想要做的事情,就是将 prc 转换成一个数字 故意 并测试结果:

var intervalId;
function randomize(){
   var prc = +$("#prc").val();
   //        ^------------------- Note the +, that converts it to a number
   if (isNaN(prc)) {
       // Handle the invalid input
       return;
   }
   var c = 0 ;
   if (!intervalId){
      intervalId = setInterval(function(){
          c = c + 1;
          var attempt = Math.random() * 100;
          if (attempt <= prc){
              clearInterval(intervalId);
              intervalId = false;
              console.log(attempt);
          }
      }, 100);
   }
}

我应该注意,如果输入 ,上面的代码可能会做一些你不想要的事情:它将使用值 0,因为 +""0。如果你不想这样,你可以这样做:

var prcString = $.trim($("#prc").val());
var prc = +prcString;
if (!prcString) {
    // Handle the fact they didn't enter anything
    return;
}
if (isNaN(prc)) {
    // Handle the invalid input
    return;
}