使用 isNaN() 检查值是否为 Javascript 中的数字

在 Javascript 中,我们有多种方法来检查某物是否是数字。这是 Javascript 中一个特别常见的任务,其中有动态类型,导致一些意想不到的东西被归类为数字。Typescript修复了其中的一些问题,但在本指南中,我们将介绍如何检查 Javascript 中的某些内容是否为数字,以及在尝试执行此操作时应避免的陷阱。

引入 isNaN#

NaN是 Javascript 中的一个特殊值,代表“Not a Number”。如果您尝试将 Javascript 中的文本字符串解析为int,您将得到 NaN:

let x = parseInt("hello") // Returns NaN

NaN这本身就有点令人困惑,而且您并不总能得到预期的结果。NaN,例如,不等于任何其他值,包括它自己。对此进行测试将始终返回 false:

5 === NaN // false
NaN === NaN // false
"foo" === NaN // false

您可能认为这一切都有意义,直到您尝试运行typeof NaN– 返回number. 事实证明,这NaN毕竟是 Javascript 中的“数字”类型:

typeof NaN // 'number'

忽略这些特性,Javascript 附带了一个内置函数来测试某些东西是否“不是数字”,称为isNaN. 这个函数可以很容易地用于确定一个东西是否会评估NaN它是否通过类似的东西运行parseFloat

isNaN("hello") // true
isNaN(5) // false
isNaN({}) // true
isNaN(() => {}) // true

由于isNaN检查某物是否不是数字,我们可以使用它!isNaN来测试某物是否是数字。例如,!isNaN(5)是一个简单的方法来测试是否5是一个数字:

!isNaN(5)

isNaN在大多数情况下是有意义的,但由于它解析数字,它可能会导致一些意想不到的副作用。例如,Number(1n)on BigInttypes 会抛出一个错误,因此isNaN也会抛出一个错误:

isNaN(1n) // throws error

为了解决其中的一些问题,Javascript 刚刚创建了一个新方法,称为Number.isNaN. 它大部分是相同的,只是它不会将类型强制转换为数字。

Number.isNaN 与 isNaN#

它们通常被认为是相同的,但isNaN工作Number.isNaN方式不同。isNaN本质上是解析输入,并尝试从中得出一个数字。这就是为什么当你尝试做时你会看到问题isNaN(1n),因为Number(1n)会抛出错误。相反,您可以使用Number.isNaN()

isNaN和之间的区别在于Number.isNaN不会Number.isNaN尝试将输入强制转换为数字。与 不同isNaN,它只是接受输入并确认它是否等于NaN。这使得

所以以下所有内容都将返回 false,因为它们都不完全等于NaN

Number.isNaN({}) // false
Number.isNaN("hello") // false
Number.isNaN(() => {}) // false
Number.isNaN("5") // false

而以下将返回 true,因为它们确实返回NaN

Number.isNaN(5 / "5") // true
Number.isNaN(parseFloat("hello")) // true

要么 要么Number.isNaNisNaN解决您的大部分数字检查需求,但是还有一种方法可以检查 Javascript 中的某物是否为数字

使用 isInteger 和 isSafeInteger 检查 Javascript 中的数字#

与 and 一样isNaNNumber.isNaN方法Number.isIntegerandNumber.isSafeInteger可以帮助您确定某物是否只是一个没有小数点的整数。就像 一样Number.isNaN,这两种方法都不会尝试将内容评估为数字。这意味着传入一个字符串将始终返回 false,而一个普通的整数将通过测试:

Number.isInteger("5") // false
Number.isInteger(5) // true
Number.isSafeInteger("5") // false
Number.isSafeInteger(5) // true

isSafeInteger不同于isInteger检查数字是否落在范围之外bigint——即在-2^53和之内2^53——所以对于大多数用例来说isInteger将完成这项工作。

在 Javascript 中使用 typeof 检查某物是否为数字#

检查某物是否为数字的最后一种方法是使用typeof– 同样,这在某些情况下可能更适合您的需求,因为typeof Math.sqrt(-1)返回number,而不是NaN– 但是类似的东西1n仍然会显示一种类型bigint

typeof Math.sqrt(-1) // 'number'
typeof parseFloat("35") // 'number'
typeof 35 // 'number'
typeof 1n // 'bigint'

但是,请小心,因为它非常不可靠。由于typeof NaNreturns number,您可能会遇到一些通常希望避免的意外情况。因此,Number.isNaN可能仍然是检查某物是否为数字的最佳方法。

typeof以下是您通常希望避免的一些意外情况:

typeof parseFloat("hello") // 'number' - since NaN is a number
typeof 5 / "5" // 'NaN' - since this evaluates typeof 5, and then divides by "5"
typeof (5 / "5") // 'number' - since this evaluates as NaN, which is a number
typeof NaN // 'number' - since NaN is of type number
typeof "5" // 'string'

结论#

在 Javascript 中检查某物是否是数字有一些复杂性,但通常很简单。关键点是:

  • isNaN是常用的,但是会将其输入评估为一个数字,这可能会导致某些输入被错误判断为NaN或抛出错误。
  • Number.isNaN是 的一个健壮版本isNaN,它检查某物是否完全等于NaN. 它不会将其内容评估为数字
  • typeof可以告诉你某个东西是number不是a,但是可能会导致一些意想不到的情况,因为NaN也是number类型。

我希望你喜欢这篇关于在 Javascript 中检查某物是否为数字的指南。您还可以在此处查看我的更多 Javascript 内容