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

Ter*_*apt 5 javascript random numbers percentage setinterval

我正在使用百分比,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);
       }
    }
Run Code Online (Sandbox Code Playgroud)
<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"/>
Run Code Online (Sandbox Code Playgroud)

但实际上,如果用户将#prc输入设置为50.345.34,则attempt <= prc条件始终返回true.我尝试console.log(isNaN(prc))将此输入设置为类似的数字50.345.34并始终返回false.

为什么它被视为数值?

T.J*_*der 7

但实际上,如果用户将#prc输入设置为50.345.34,则尝试<= prc条件始终返回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);
   }
}
Run Code Online (Sandbox Code Playgroud)

我应该注意,如果输入为,上面的内容可能会做你不想要的事情:它会使用值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;
}
Run Code Online (Sandbox Code Playgroud)

  • @TerryRapt:是的,`input`的`value`是*always*一个字符串,即使对于新的输入类型也是如此.jQuery的`val`只返回一个字符串(如果jQuery集中有任何元素你调用它)或`undefined`(如果该集完全为空,但这不适用于你的情况我假设). (2认同)
  • @hindmost:没有.`parseInt`和`parseFloat`停在第一个无效字符处,如果有的话,返回字符串***处的数字.但是`Number`和隐式转换(与`<=`,上面使用的一元`+`,或```或`/`或`-`)转换(或无法转换)整个**串.所以`parseInt("50.345.34")`是'50`,`parseFloat("50.345.34")`是'50.345`,而`+"50.345.34"`是`NaN`.不幸的是(在我看来),有一个奇怪的例外,即隐式转换将空字符串(""")转换为"0". (2认同)