Javascript < 运算符在条件绝对为真时返回 false 的问题

Issue with Javascript < operator returning false when condition is definitely true

我在使用 javascript 作为搜索结果页面的一部分时遇到问题,希望有人能提供帮助。我有一个函数可以检查变量 'currentAmount' 是否小于变量 'total'。如果 currentAmount 小于 total,则做一些事情,否则什么都不做。

    var currentAmount = document.getElementById('currentAmountHidField').value;
    var total = '@Html.Raw(Json.Encode(Model.ResultCount))';
    var tempScrollTop = $(window).scrollTop();

    function loadMore() {
        alert("current amount" + currentAmount);
        alert("total" + total);
        var listView = $("#propertyList").data("kendoListView");

        if (currentAmount < total) {
            alert("function is being run");
            currentAmount = +currentAmount + 12;
            document.getElementById('currentAmountHidField').value = currentAmount;
            if (currentAmount >= total) {
                $('#loadMoreButton').hide();
            }
        }
        else {
            alert("function is not being run");
        }

        listView.dataSource.pageSize(currentAmount);
        listView.refresh();
        tempScrollTop = $(window).scrollTop();
    }

在上面,currentAmount 最初总是 12。在大多数情况下,这完全可以正常工作,但对于一个搜索实例,其中 total = 108,javascript 正在处理 else 子句的功能。即显示 "function is not being run" 的警报。我不明白为什么。

请注意,那里有用于测试的警报。它将弹出 "currentAmount12" 然后 "total108" 然后 "function is not being run"。这没有任何意义?我什至尝试立即对这 2 个数字执行其他操作(例如从 108 中减去 12),只是为了检查这些数字是否被处理为数字,它们确实如此。就像我说的,这适用于我能够测试的所有其他数字组合。

这就像 javascript,仅对于一个搜索条件,读取 12 比 108 多。有趣的是,当我在 loadMore 函数的第一行中将值硬核为 12 时,它将 运行 相应地,但显然那是不好的。

如有任何帮助,我们将不胜感激。为什么 javascript 会认为 12 大于 108?

谢谢

currentAmounttotal 都是字符串,所以它们是按字典序而不是数字进行比较的。 '12' 大于 '108'.

使用 parseInt() 将输入值转换为数字,并省略 total 两边的引号,这样它就是一个数字。

var currentAmount = parseInt(document.getElementById('currentAmountHidField').value, 10);
var total = @Html.Raw(Json.Encode(Model.ResultCount));

当您写道时,您显然知道这是一个问题:

currentAmount = +currentAmount + 12;

因为 currentAmount 之前的 + 用于将其转换为数字(因此您得到加法而不是连接)。我猜你不知道它也会影响比较。

您从表单控件获得的所有值都是字符串,因此这就是您的 currentAmount 包含的内容。然后突然间它应该是有道理的,例如“12”<“5”,因为“1”小于“5”。

解决方案:使用 parseInt() or parseFloat() 获取变量中的实际数字,而不是 strings-that-resemble-numbers-but-arent。

请将您的字符串变量解析为您想要的类型:parseFloat/ parseInt

function loadMore() {

currentAmount = parseInt(currentAmount);
total = parseInt(currentAmount);
...


}