parseInt()意外地等同于NaN

时间:2015-03-19 13:46:13

标签: javascript jquery validation

我有一个文本框,可能是空白或数字(非数字字符在之前的关头验证)。

当我使用intParse()时,我的整数输出为NaN。

我的代码:

HTML:

<input type="text" id="textbox" value=""/>
<button>Input number or leave blank to test</button>

jQuery的:

$('button').click(function() {

    //Check normal value...
    var $textboxvalue = $('#textbox').val();
    alert("#textbox=" + $textboxvalue);

    //If no value, set as 0 to avoid Nan for intParse...
    var $textbox;               
    if ($('#textbox').val()) {
        $textbox = $('#textbox').val();
    }
    else{
        $textbox = 0;
    }   
    alert("$textbox=" + $textbox);

    //Parse integer...
    var $textboxParsed = parseInt($($textbox).val(), 10);
    alert("$textboxParsed=" + $textboxParsed);

    //Subsequent action...
    var $textboxPlus5 = $textboxParsed + 5;
    alert("$textboxPlus5=" + $textboxPlus5);

});

的jsfiddle: https://jsfiddle.net/f4n6rz1p/1/

为什么intParse()产生NaN并且我是否正确有条件地将空白输入更改为零以避免Nan为intParse()?

2 个答案:

答案 0 :(得分:4)

我认为应该是:

var $textboxParsed = parseInt($textbox , 10);

而不是:

var $textboxParsed = parseInt($($textbox).val(), 10);

编辑:我添加了理性,为什么应该在评论中完成上述操作。进一步思考,您可以简化代码:

var $textboxvalue = $('#textbox').val();
$textbox = '' === $textboxvalue ? 0 : parseInt($textboxvalue);

这是假设您的输入值为空(即空字符串,没有空格)或数字整数值。

答案 1 :(得分:3)

在此代码中,您将$textbox设置为文本框的(或0):

var $textbox;               
if ($('#textbox').val()) {
    $textbox = $('#textbox').val();
}
else{
    $textbox = 0;
}

然后你要解析一个额外的$(...).val()

var $textboxParsed = parseInt($($textbox).val(), 10);
// Here ----------------------^^--------^^^^^^^

此时,由于$textbox的文本框中包含,这意味着您要求jQuery根据该值创建jQuery对象。该jQuery对象可能没有任何元素,因为搜索(例如)$("123")将找不到任何东西。因此,当您在其上调用val时,您会得到undefined,因为空jQuery集上的val会为您提供undefined。然后parseInt然后将undefined转换为字符串"undefined",然后再尝试解析它 - 然后为您提供NaN

您不希望$(...)或第二次.val来电:

var $textboxParsed = parseInt($textbox, 10);

附注:如果您想将0用于空文本框,可以使用JavaScript's curiously-powerful || operator使其更简洁:

var $textbox = $('#textbox').val() || 0;

$textbox如果不是空白,则会以文本框中的值结束,如果为空,则为0

(或者使用"0",因为您稍后会解析它,但是对已经是数字的内容调用parseInt是无害的。)