【问题标题】:Javascript "NaN" in an IF Statement [duplicate]IF 语句中的 Javascript“NaN”[重复]
【发布时间】:2021-05-29 21:50:58
【问题描述】:

这是一个关于 IF 语句中 NaN 的初学者 JS 问题。我有下面的代码提示用户输入一个数字,程序将生成一个介于 1 和用户输入之间的随机数。但是,如果用户没有输入数字,它会提示用户重试并输入有效数字。

const userInput = prompt("Please enter a number.");
const userNumber = parseInt(userInput);

if (userNumber) {
  const randomNumber = Math.floor( Math.random() * userNumber ) + 1;
  console.log(`${randomNumber} is a number between 1 and ${userNumber}`);
} else {
  console.log(`Please enter a valid number.`);
}

我的问题是 IF 语句的 userNumber 部分。条件基本上是询问 IF userNumber 是一个数字,然后输出随机数。但是为什么它只是简单地写在条件中的变量,而不是 if (userNumber != NaN) 或 if (userNumber == number) 之类的条件?为什么它只是条件中的变量?

对我来说,阅读那行代码我在想:“......如果 userNumber 是什么?在 userNumber 之后什么都没有,那么条件是什么?”

【问题讨论】:

  • 这不是if (userNumber) 所做的。它检查它是否真实。因为它是parseInt 的返回值,所以它将是number 类型,并且该类型中只有两个值不是truthyNaN...和0。如果用户输入0,它会将其视为无效数字而忽略。您可能还想更好地处理负数...
  • 如果要专门测试NaN,请使用if( isNaN(userNumber))

标签: javascript


【解决方案1】:

你的怀疑是对的,

if(userNumber) ...

将测试userNumber 是否为“真实”,即它将测试它是否具有不同于0 的值。输入0 将严格地说数字并且在这方面if-condition 可能无法按预期进行测试。

另一方面,它也可以被视为写作的捷径:

if (!isNaN(userNumber) && userNumber!=0)...

【讨论】:

    【解决方案2】:

    当控制台记录时,NaN 是 randomNumber 变量。
    当您将 undefined 作为参数传递时,数学方法返回 NaN。

    const userNumber = undefined;
    const randomNumber = Math.floor( Math.random() * userNumber ) + 1;
    console.log(`${randomNumber} is a number between 1 and ${userNumber}`);

    使用 userNumber 触发条件,可以是数字也可以是单词,因为 userInput 包含 truthy 值:

    假值:未定义、空值、0、“”、假
    真值:1、“0”、 “字符串”,真

    【讨论】:

      【解决方案3】:

      在 Javascript 条件语句中检查真实值并进行强制类型转换。不需要在 If 语句中显式进行比较。

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else

      https://developer.mozilla.org/en-US/docs/Glossary/Truthy

      【讨论】:

        【解决方案4】:

        Mozilla 说;

        isNaN() 函数确定一个值是否为 NaN。注意,isNaN 函数内部的强制转换有一些有趣的规则;您也可以使用 ECMAScript 2015 中定义的 Number.isNaN()

        function milliseconds(x) {
          if (isNaN(x)) {
            return 'Not a Number!';
          }
          return x * 1000;
        }
        
        console.log(milliseconds('100F'));
        // expected output: "Not a Number!"
        
        console.log(milliseconds('0.0314E+2'));
        // expected output: 3140

        More Details

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-01
          • 2013-08-08
          • 2014-09-09
          • 2019-04-28
          • 2016-11-21
          • 2020-05-01
          • 2020-10-25
          • 2012-01-12
          相关资源
          最近更新 更多