parseInt 不起作用

parseInt doesn't work

本文关键字:不起作用 parseInt      更新时间:2023-09-26

在我当前的源代码文本框中,值为 1。当我尝试alert(isNaN(obj.text())时,它会返回预期的false但是当我编写alert(a);时解析Int之后,它会返回NaN

minus.click(function () {
     var a = 1; if (!isNaN(obj.text())) a = parseInt(obj.text()); 
     if (a > 1) a -= 1; obj.text(a);
});

问题出在哪里?

编辑:这是完整的代码:

<input type="text" class="basket-txt" value="1" />

jQuery.fn.basket = function (options) {
    var defaults = {
    }
    options = jQuery.extend(defaults, options);
    this.each(function () {
        var $this = $(this);
        $this.height(32).css({ 'line-height': '32px', 'font-weight': 'bold', 'width':'40px', 'text-align':'center', });
        var tbl = $('<table border="0" style="border-spacing:0px;float:left;">').appendTo($this.parent());
        var tr1 = $('<tr>').appendTo(tbl);
        var plus = $('<div class="basket-plus">');
        $('<td>').append(plus).appendTo(tr1);
        $('<td>').append($this).appendTo(tr1);
        var minus = $('<div class="basket-minus">');
        $('<td>').append(minus).appendTo(tr1);
        var tr2 = $('<tr>').appendTo(tbl);
        $('<td>').appendTo(tr2);
        $('<td>').appendTo(tr2).append($('<div>').addClass('add-to-basket'));
        $('<td>').appendTo(tr2);
        $this.keypress(function (e) { if (e.which < 48 || e.which > 57) e.preventDefault(); });
        minus.click(function () {
            var a = 1; if (!isNaN($this.text())) a = parseInt($this.text()); 
            if (a > 1) a -= 1; $this.text(a);
        });
        plus.click(function () {
            var a = 1; if (!isNaN($this.text())) a = parseInt($this.text());
            if (a < 1000000) a += 1; $this.text(a);
        });
    });
}

实际上我知道我可以纠正代码并且它会起作用,我关心的是理解为什么 isNaN 返回 false 但 parseInt 返回 NaN

jQuery text() 方法将获取元素的所有后代文本节点,并将它们组合成一个字符串。

input元素不能有任何类型的后代节点。它的当前值通过 value 属性公开,您可以使用 jQuery 中的 val() 方法读取该属性。

不应使用不带基数的parseInt,尤其是在自由格式输入时。您可能会获得八进制或十六进制数据,而不是小数。

parseInt($this.val(), 10)

你得到一个<input>的值是.val(),而不是.text()

isNaN()函数返回isNaN("")false。为什么?因为当""(空字符串)转换为数字时,它是0.将一个非数字传递给isNaN(),它做的第一件事就是将值强制转换为数字。

无论如何,在parseInt()之前尝试isNaN()是没有意义的,因为parseInt()会告诉你什么时候它无法解析一个漂亮的整数。 但请注意,parseInt()并不关心输入末尾是否有垃圾。

如果要在字符串是数字的有效字符串表示形式时将其转换为数字,而当字符串不是时NaN

,则可以使用
var myNumber = +myString;

这也将接受带有小数部分和指数的数字,因此您必须将其截断为整数或检查它是否为整数:

var myNumber = +myString;
if (isNaN(myNumber))
  // not a valid number
else if (myNumber !== Math.floor(myNumber))
  // not an integer
else
  // yaay!
minus.click(function () {
    // let's parse the integer first
     var num = parseInt( obj.val(), 10 );
     // then later, we can check if it's NaN
     if ( !isNaN(num) && num > 1 ) {
        num -= 1;
        obj.val(num);
     }
});


实际上我知道我可以纠正代码,它会起作用,我担心的是 理解为什么 isNaN 返回 false 但 parseInt 返回 NaN

isNaN 没有按照应有的方式工作。有类型胁迫正在进行。
isNaN 将首先将值转换为数字。空字符串将转换为0

Number("") === 0; // true

0显然不是 NaN,所以它返回 false。

parseInt 不执行类型强制,它以不同的方式解析值。

检查这个问题和其他问题以供参考。

第一个非空格字符无法转换为数字时,parseInt 返回 NaN。