30

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

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

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


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

  • 的类型NaNNumber,
  • NaN确实表示“不是数字”,这与“非类型Number”不同,
  • 0/0是一个很好的例子NaN:它仍然是一个数字,但是 JavaScript(并且没有其他人)可以说出零除以零的实际值是多少。1/0另一方面返回Infinity,事实并非如此NaN
4

6 回答 6

23

据我了解,它NaNNumber该类的一个哨兵实例,它代表了它所代表的确切含义——无法充分表示的数字结果。So0/0不是一个数字,在某种意义上它是NaN,但它一个Number就其类型而言。

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

于 2010-07-09T17:35:25.427 回答
14

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

于 2010-07-09T17:34:58.843 回答
1

您将对象的类型value混淆了。NaN是可以为类型对象分配的特定值,number例如在将零除以零或尝试从不代表数字的字符串转换数字时。

于 2010-07-09T17:37:17.980 回答
1

您应该查看Wikipedia 文章。它有更多细节。

于 2010-07-09T17:41:43.227 回答
1

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
于 2010-07-09T18:18:27.207 回答
0

除了已经说过的话,我认为如果你除以例如一个字符串。它尝试返回 NaN,但仍将其视为一个数字。

于 2010-07-09T17:39:24.683 回答