为什么 "Number" 让 "else if" 在这里工作?

why does "Number" make the "else if" work here?

我有个任务要跟if/elseif玩一下。 我不明白为什么,当我像下面的示例一样编写代码时,“else if(age === 18)”部分不起作用。它显示为“未定义”。其他 2 个工作。 但是,当我在所有这些中添加 (Number(age)) 时,它起作用了。为什么会这样?为什么我可以使用 2/3 而不使用“Number”,但我需要它才能使用 3/3?

var age = prompt("Please type your age!");
if (age < 18) {
    alert("Sorry, you are too young to drive this car. Powering off");
} else if (age === 18) {
    alert("Congratulations on your first year of driving. Enjoy the ride!");
} else if (age > 18) {
    alert("Powering On. Enjoy the ride!");
}

导致promptreturns一个字符串。 但是 < & > 运算符将字符串转换为数字

var age = prompt("Please type your age!");
if (age < 18) {
    alert("Sorry, you are too young to drive this car. Powering off");
} else if (age === '18') {
    alert("Congratulations on your first year of driving. Enjoy the ride!");
} else if (age > 18) {
    alert("Powering On. Enjoy the ride!");
}

prompt returns 一个字符串,不能严格等于数字 18 因为类型不同。但是,如果您使用松散相等 (==)。

将其转换为数字的最简单方法是使用一元加号运算符,其功能与 Number 函数大致相同。

var age = +prompt("Please type your age!");

您需要将字符串转换为数字。最简单的方法是取 unary plus +.

对于数字,您可以通过严格比较 Identity/strict equality operator === 与数字进行检查,因为您至少具有相同的类型。

var age = +prompt("Please type your age!");
if (age < 18) {
    alert("Sorry, you are too young to drive this car. Powering off");
} else if (age === 18) {
    alert("Congratulations on your first year of driving. Enjoy the ride!");
} else {
    alert("Powering On. Enjoy the ride!");
}

因为prompt return是一个字符串

运算符 <> 允许您将字符串与数字进行比较,方法是 pre-converting 将字符串与数字进行比较,然后再进行比较。阅读 this article 了解更多信息,在 JS 中称为“Type Coersion”。

=== 运算符不会执行此类型 coercion/conversion,它会直接将 "18"18 和 return 进行比较。

要解决此问题,您可以改用其他等于运算符 ==,它包含类型强制转换。

但是,更好的方法是检查输入是否确实是一个数字,如下所示:

var age = Number(prompt("Please type your age!"));

if (Number.isNaN(age)) {
    alert("Try again with a number");
} else if (age < 18) {
    alert("Sorry, you are too young to drive this car. Powering off");
} else if (age === 18) {
    alert("Congratulations on your first year of driving. Enjoy the ride!");
} else if (age > 18) {
    alert("Powering On. Enjoy the ride!");
}