我有一个if语句,用于检查用户输入的数字是否为0到数组的最后一个索引之间的数字。当我输入数字以外的其他内容时,它会显示“ 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 + ".");
}
});
答案 0 :(得分:0)
由于您要使用输入的值作为数字,而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
。但是,转换为数字后,这些比较将可以正确地用作数字比较,而不是字符串比较。
edit -另一个错误:在错误alert()
调用中,必须用括号tasks.length-1
括起来。如果不这样做,则调用中的表达式将被解释为如同被编写
(("Please enter a number between 0 and " + tasks.length) - 1) + "."
减法运算符总是尝试将其自变量转换为数字,显然,最初 string 加法的结果将最终为NaN
。我已经修复了示例代码。
答案 1 :(得分:0)
prompt()
始终返回一个字符串。
减法将尝试将字符串强制转换为数字,因此纠正此问题的一种方法是仅确保在其余警报中在加法(串联)之前进行该操作:
let tasks = {length: "5"}
alert("Please enter a number between 0 and " + (tasks.length-1) + ".");
此处的括号与数学方程式完全相同:它们控制运算的顺序。有了上面的括号,tasks.length - 1
首先发生,并且因为它是减法,所以变量(由于较早的isNaN()
测试,我们只包含数字字符)被成功地强制为数字。然后,对结果执行“加法”操作(从左到右顺序),顺便将其转换回字符串。
不带括号,该操作将从左到右进行,因此您首先要串联“请输入介于0和”之间的数字和tasks.length
(字符串)。然后它将尝试从中减去1,但是由于无法将“请输入数字”转换为数字,因此您会以NaN
结尾。最后是“。”被串联起来,得到字符串“ NaN”。
let tasks = {length: "5"}
alert("Please enter a number between 0 and " + tasks.length-1 + ".");
答案 2 :(得分:0)
问题是因为您有一个字符串,您需要将Number中的taskIndex转换为Number(taskIndex)