我有一个if语句,用于检查用户输入的数字是否是0和数组最后一个索引之间的数字。当我输入数字以外的内容时,它不是转到代码的"else"部分并显示警报消息,而是显示"NaN"。
$("#delete_task").click(function() {
var taskIndex = prompt("Please enter the index number of the task to delete.",0);
if(!isNaN(taskIndex) && taskIndex >= 0 && taskIndex < tasks.length) {
tasks.sort();
tasks.splice(taskIndex, 1);
displayTaskList();
} else {
alert("Please enter a number between 0 and " + tasks.length-1 + ".");
}
});
prompt()
总是返回一个字符串。
减法将尝试将字符串强制转换为数字,因此纠正此问题的一种方法是确保在警报其余部分的加法(串联)之前发生:
let tasks = {length: "5"}
alert("Please enter a number between 0 and " + (tasks.length-1) + ".");
这里的括号的工作方式与数学方程式完全相同:它们控制运算顺序。 使用上面的括号,tasks.length - 1
首先发生,并且因为它是减法变量(我们知道由于前面的isNaN()
测试,它只包含数字字符)被成功强制转换为数字。 然后对结果进行"加法"操作(按从左到右的顺序),顺便将其转换回字符串。
如果没有括号,操作将从左到右进行,因此您首先连接"请输入 0 到 0 之间的数字"和(字符串)tasks.length
。 然后它会尝试从中减去 1,但由于"请输入一个数字"无法转换为数字,您最终会得到NaN
.最后,"."被连接到上面,产生字符串"NaN.":
let tasks = {length: "5"}
alert("Please enter a number between 0 and " + tasks.length-1 + ".");
问题是因为你有一个字符串,你需要在数字与数字(taskIndex)中转换任务索引
因为您想将输入的值用作数字,而prompt()
总是返回一个字符串,所以您需要在其中执行一个额外的步骤来将提示响应转换为数字:
$("#delete_task").click(function() {
var taskIndex = prompt("Please enter the index number of the task to delete.",0);
taskIndex = Number(taskIndex); // or +taskIndex
if(!isNaN(taskIndex) && taskIndex >= 0 && taskIndex < tasks.length) {
tasks.sort();
tasks.splice(taskIndex, 1);
displayTaskList();
} else {
alert("Please enter a number between 0 and " + (tasks.length-1) + ".");
}
});
isNaN()
检查仍然有效,因为如果您在提示对话框中键入"foo",转换将导致NaN
。 但是在转换为数字后,比较将正常工作为数字比较,而不是字符串比较。
编辑— 另一个错误:在错误alert()
调用中,您必须用括号括tasks.length-1
。否则,调用中的表达式将被解释为编写的表达式
(("Please enter a number between 0 and " + tasks.length) - 1) + "."
减法运算符总是尝试将其参数转换为数字,显然初始字符串相加的结果最终将NaN
.我已经修复了示例代码。