在 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 BigInt
types 会抛出一个错误,因此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.isNaN
将isNaN
解决您的大部分数字检查需求,但是还有一种方法可以检查 Javascript 中的某物是否为数字
使用 isInteger 和 isSafeInteger 检查 Javascript 中的数字#
与 and 一样isNaN
,Number.isNaN
方法Number.isInteger
andNumber.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 NaN
returns 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 内容。