为什么 typeof NaN 返回 “number”?

2022-08-30 01:12:00

只是出于好奇。

数字似乎不是很合乎逻辑。顺便说一句,就像或返回假的。这是JavaScript的特点之一,还是有原因的?typeof NaNNaN === NaNNaN == NaN

编辑:感谢您的回答。不过,要让人们头到处走并不是一件容易的事。阅读答案和wiki我理解得更多,但仍然像这样的句子

与 的比较始终返回无序结果,即使与自身进行比较也是如此。比较谓词要么是信令,要么是非信令,信令版本表示此类比较的无效例外。相等和不等式谓词是非信号性的,因此返回 false 可用于检验 x 是否为安静 。NaNx = xNaN

只是让我的头旋转。如果有人能用人类(而不是数学家)的可读语言翻译它,我将不胜感激。


答案 1

好吧,似乎有点奇怪,所谓的“不是数字”被认为是一个数字,但仍然是一个数字类型,尽管这是事实:-)NaN

NaN只是意味着特定值不能在数值类型的限制内表示(尽管对于所有必须四舍五入以适合的数字都可以这样说,但这是一种特殊情况)。NaN

一个特定值不被视为等于另一个特定值,因为它们可能是不同的值。但是,仍然是一种数字类型,就像 2718 或 31415 一样。NaNNaNNaN


至于你更新的问题,用外行人的话来解释:

与 NaN 的比较始终返回无序结果,即使与自身进行比较也是如此。比较谓词要么是信令,要么是非信令,信令版本表示此类比较的无效例外。相等和不相等谓词是非信号性的,因此 x = x 返回 false 可用于测试 x 是否为安静的 NaN。

所有这些意味着(分解为几个部分):

与 NaN 的比较始终返回无序结果,即使与自身进行比较也是如此。

基本上,a 不等于任何其他数字,包括另一个,甚至包括它本身NaNNaN

比较谓词要么是信令,要么是非信令,信令版本表示此类比较的无效例外。

尝试在一个数字和另一个数字之间执行比较(小于、大于等)操作可能会导致抛出异常(信令),或者只是得到假结果(非信令或安静)。NaN

相等和不相等谓词是非信号性的,因此 x = x 返回 false 可用于测试 x 是否为安静的 NaN。

相等性(等于,不等于)的测试永远不会发出信号,因此使用它们不会导致异常。如果你有一个常规数字,那么将永远是真的。如果 是 ,则始终为假。它为您提供了一种轻松(安静)检测的方法。xx == xxNaNx == xNaN


答案 2

它意味着不是一个数字。这不是javascript的特点,而是常见的计算机科学原理。

http://en.wikipedia.org/wiki/NaN

有三种操作返回 NaN:

将 NaN 作为至少一个操作数的操作

不确定形式

  • 除法 0/0、∞/∞、∞/−∞、−∞/∞ 和 −∞/−∞
  • 乘法 0×∞ 和 0×−∞
  • 功率 1^∞
  • 加法∞ + (−∞)、(−∞) + ∞和等价减法。

具有复杂结果的实际操作:

  • 负数的平方根
  • 负数的对数
  • 90 度(或 π/2 弧度)的奇数倍的正切值
  • 小于 −1 或大于 +1 的数字的反正弦或余弦。

所有这些值可能都不相同。NaN的一个简单测试是测试是否为假。value == value