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?
谢谢
currentAmount
和 total
都是字符串,所以它们是按字典序而不是数字进行比较的。 '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);
...
}
我在使用 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?
谢谢
currentAmount
和 total
都是字符串,所以它们是按字典序而不是数字进行比较的。 '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);
...
}