为什么 JavaScript 说数字不是数字?

IT技术 javascript nan typeof
2021-03-01 02:46:19

我有一段 JavaScript 代码,预计将一个整数值设置为一个变量。

有些东西坏了,所以当我尝试做时alert(A);,它返回NaNisNaN(A);返回真。但如果我alert(typeof(A));,它说number

那么一个变量怎么可以同时是一个数字而不是一个数字呢?也许我误解了 NaN 到底是什么?


编辑:感谢答案,我发现我错了,因为:

  • 的类型NaNNumber
  • NaN确实意味着“不是数字”,这与“非类型Number”不同,
  • 0/0是一个很好的例子NaN:它仍然是一个数字,但 JavaScript(和其他人)可以说出零除以零的实际值是多少。1/0另一方面返回Infinity,这不是NaN
6个回答

据我了解,它NaNNumber该类的一个哨兵实例,它代表了它所代表的内容——无法充分表示的数字结果。So0/0不是数字,就其类型而言,NaN,但就Number其类型而言,a

也许它应该被称为 NaRN(Not a Representable Number)。

0/0 产生 NaN。除以零的所有其他实例产生 +/- 无穷大。
2021-04-26 02:46:19
1/0Infinity,并且Infinity不是NaN但我看到了我的问题的答案。我误解了这NaN意味着,就像你说的,“无法充分表示的数字结果”,而不是“非类型Number”。
2021-05-01 02:46:19
感谢所有人 - 我已经适当地更正了帖子以0/1用作NaN. 令人印象深刻的是,我可以从标记为正确的答案中学到一些东西 - 去 StackOverflow!
2021-05-03 02:46:19
@AndrzejDoyle 这是公认的答案,我鼓励您添加另一个实例的示例,您将获得 NaN 结果:尝试在其中一个运算符未分配时执行数学运算:var percent; var test = percent * 100;将产生 NaN 结果,因为我们从未分配过百分比数字。
2021-05-06 02:46:19
实际上“NaN”的类型是数字,因为它没有意义。不可表示的数字是“Infinity”,而不是“NaN”,尽管我从未在实际代码中看到 Infinity 值。
2021-05-14 02:46:19

如果您有一个变量并为其分配结果 0/0,则该变量仍然是数字类型,但值未定义(不是数字)。在其他条件下可能会发生这种情况,但这说明了您所看到的情况。

typeof NaN == '数字'。这就是为什么它看起来是数字类型的原因
2021-04-29 02:46:19
“1/0”产生无穷大。“-1/0”产生-Infinity。“0/0”产生 NaN
2021-05-07 02:46:19
@Jason S——我现在意识到这一点,但我仍然认为整数的行为很奇怪。想一想:我想把 4 样东西分给 2 个人——每个人得到 2 样东西。现在,假设我想在零个人中分配 4 件事。在只有 4 件东西的情况下,说 0 个人每个人都能得到无限多的东西,这是无稽之谈。只有当我们认为它可能正在执行 IEEE754 浮点算术时才真正有意义,尽管我们使用的是整数值,这些值是以这种方式明确定义的。
2021-05-09 02:46:19
你确定除以零的结果是 NaN 而不是 Inf?我认为 0/0 导致 NaN 并尝试解析不代表数字的字符串。
2021-05-16 02:46:19
@inflagranti - 我曾假设除以零将由 NaN 表示,但显然不是。我的小学老师会对此感到非常惊讶:en.wikipedia.org/wiki/Division_by_zero
2021-05-20 02:46:19

将对象类型混淆了NaNnumber可以分配给类型对象的特定值,例如在零除以零的情况下或尝试从不表示数字的字符串转换数字时。

谢谢你。我明白。是的,0/0NaN(与 相反1/0)。
2021-05-11 02:46:19

您应该查看维基百科文章它有更多细节。

在这个答案中添加一些相关的部分会使它变得更好。
2021-04-23 02:46:19

W3Schools 的一些定义:

Infinity:表示正/负无穷大的数值

POSITIVE_INFINITY 属性表示无穷大,在溢出时返回。NEGATIVE_INFINITY,表示负无穷大(溢出时返回)。

NaN 属性表示“非数字”值。此属性指示值不是合法数字。

isFinite() 函数确定一个数字是否是一个有限的合法数字。如果值为 +infinity、-infinity 或 NaN,则此函数返回 false。

一些测试:

 var n1 = 1/0;
  var n2 = 0/0;
  var n3 = (Number.MAX_VALUE)*2; //overflow

  var b1 = Number.POSITIVE_INFINITY == n1;
  var b2 = Number.POSITIVE_INFINITY == n2;
  var b2n = Number.NEGATIVE_INFINITY == n2;
  var b3 = Number.POSITIVE_INFINITY == n3;

  var msg = "n1=" + n1 + ", n2=" + n2 + ", n3=" + n3;

  msg += "<br/> n1 Is POSITIVE_INFINITY=" + b1;
  msg += "<br/> n2 Is POSITIVE_INFINITY=" + b2;
  msg += "<br/> n2 Is POSITIVE_INFINITY=" + b2n;
  msg += "<br/> n3 Is POSITIVE_INFINITY=" + b3;

  msg += "<br/> n1 IsFinite=" + isFinite(n1);
  msg += "<br/> n2 IsFinite=" + isFinite(n2);
  msg += "<br/> n3 IsFinite=" + isFinite(n3);


  msg += "<br/> n1 + n1 =" + (n1 + n1) ;
  msg += "<br/> n1 - n1 =" + (n1 - n1) ;
  msg += "<br/> n2 + n1 =" + (n2 + n1) ;

  document.write(msg);

演出

n1=Infinity, n2=NaN, n3=Infinity
n1 Is POSITIVE_INFINITY=true
n2 Is POSITIVE_INFINITY=false
n2 Is POSITIVE_INFINITY=false
n3 Is POSITIVE_INFINITY=true
n1 IsFinite=false
n2 IsFinite=false
n3 IsFinite=false
n1 + n1 =Infinity
n1 - n1 =NaN
n1 - n1 =NaN
为什么这很奇怪?ECMA-262 rev 3 sec 11.6.3 说:“在其余情况下,既不涉及无穷大,也不涉及零,也不涉及 NaN,并且操作数具有相同的符号或具有不同的幅度,总和被计算并四舍五入为使用 IEEE 754 舍入到最近模式的最接近的可表示值。如果幅度太大而无法表示,则运算溢出,结果是适当符号的无穷大。ECMAScript 语言需要支持 IEEE 754 定义的逐渐下溢.” (我的重点)
2021-04-22 02:46:19
JavaScript 在处理溢出时有一个非常奇怪的行为。没想到(Number.MAX_VALUE) * 2会给Infinity
2021-05-02 02:46:19
(那是为了加法,但 11.5.1 对乘法也说了同样的话)
2021-05-16 02:46:19