【问题标题】:NaN when printing to console but typeof is number jquery打印到控制台时的 NaN 但 typeof 是数字 jquery
【发布时间】:2015-06-01 02:29:38
【问题描述】:

我正在实现一个计时器,并试图找出为什么在输入“秒”框中输入大于 60 的数字时无法更改“分钟”输入框的内容。当我打印“mins”的值时,我得到 NaN,但是当我打印它的类型时,我得到它的一个数字。我刚刚开始使用 JavaScript,所以任何帮助将不胜感激。谢谢:)

jQuery:

$(function(){
    $("#sec").change(function(){
        if($("#sec").val() >= 60){
            secs = parseInt( $("#sec").val() );
            console.log("secs is " + secs );

            if(secs < 0){
                alert("Please enter a valid time interval");
                $("#sec").val("");
                return;
            }

            mins = parseInt( $("#min").val() );
            console.log("mins is " + mins );
            console.log(typeof mins);
            hours = parseInt( $("#hour").val() );
            days = parseInt( $("#day").val() );

            secs = secs % 60;
            mins = mins + Math.floor(secs/60);//can be > 60
            console.log("mins is " + mins );
            console.log(typeof mins);
            hours += mins/60;
            days += hours/24;
            $("#min").val(mins);
            $("#hour").val(hours + mins/60);
            $("#day").val(days + hours/24);
        }
    });
});

html:

div class="left"></div>
    <div class="center">
        <h3> Please enter a time: </h3>
        <form class="form-inline">

            <div class="form-group col-xs-2">
                <input id="day" class="form-control input-sm input" type="number" value="" name="Days" placeholder="Days">
            </div>
            <div class="form-group col-xs-2">
                <input id="hour" class="form-control input-sm input" type="number" value="" name="Days" placeholder="Hours">
            </div>
            <div class="form-group col-xs-2">
                <input id="min" class="form-control input-sm input" type="number" value="" name="Days" placeholder="Minutes">
            </div>
            <div class="form-group col-xs-2">
                <input id="sec" class="form-control input-sm input" type="number" value="" name="Days" placeholder="Seconds">
            </div>    

【问题讨论】:

  • 常量NaN的类型“数字”。
  • 为什么大家都一直使用parsetInt?数字有什么问题?
  • @dandavis:确实,或者+。很长一段时间以来,当引擎扩展 JS 以支持八进制时,使用带基数的 parseInt 很重要,因为八进制前缀是 0 并且用户一直在开头输入带有 0 的数字,而不希望它们是八进制。如果用户输入012,他们的意思可能是十进制的 12,而不是十进制的 10。所以使用parseInt(str, 10) 变成了de rigur。 ES5 明确表示引擎真的不应该这样做,甚至在严格模式下禁止它,这让生活更轻松(十六进制前缀问题不大;用户不太可能输入 0x12 并表示 12 位十进制...... )
  • 从技术上讲,您应该在 BEFORE 执行 if() 测试之前对 secs 值执行 parseInt。基本上你有If (somestring &gt; 60) { convert string to int }
  • @MarcB:没关系,因为 ">" 运算符会将字符串转换为数字以匹配 60...

标签: javascript jquery nan typeof


【解决方案1】:

尽管名称“不是数字”,typeof NaN"number"。对真的。 :-) NaNInfinity 一样,属于数字类型。它是为 IEEE-754 中的数字定义的(JavaScript 和许多其他编程语言使用的浮点数格式;具体来说,JavaScript 使用现在称为“binary64 子格式”,又名“双精度”)。

如果您在无法解析的内容上调用parseInt,它将返回NaN。比如:

var n = parseInt("");
console.log(typeof n); // "number"
console.log(n);        // "NaN"

如果您想在 0 为空白时使用 0(等),您可以使用 JavaScript's curiously-powerful || operator

mins = parseInt( $("#min").val() ) || 0;

这会给你返回的号码parseInt,或者如果parseInt返回0NaN,则返回0


旁注:

    1234563例如,n = parseInt(str, 10)。否则,它会尝试从输入中猜测(大多数情况下,它将以0x 开头的字符串视为十六进制)。
  1. parseInt 会很乐意忽略数字后的多余字符。例如str = "4 apples"; n = parseInt(str) 给我们n = 4。如果您不希望这种行为,您可以使用+ (n = +str;) 或Number (n = Number(str)),两者都考虑整个 字符串。但它们也都接受开头的0x 表示十六进制,并且不支持使用基数(数字基数)。

【讨论】:

  • 太棒了!这很有帮助:) 谢谢!
  • @dandavis: "object"object reference 一样,null 是。事实上,它的主要目的是在与需要空引用的对象类型的强类型环境(如 DOM)交互时提供一种表示“无对象”的方法。
  • @unikitty94:很高兴有帮助。如果这回答了你的问题,那么 SO 的工作方式,你会“接受”这个答案; details。但前提是确实如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2016-09-21
  • 1970-01-01
  • 2023-03-22
  • 2019-07-19
相关资源
最近更新 更多