代码之家  ›  专栏  ›  技术社区  ›  Arseni Mourzenko

为什么javascript说数字不是数字?[复制品]

  •  24
  • Arseni Mourzenko  · 技术社区  · 14 年前

    这个问题已经有了答案:

    我有一段javascript代码,它将为变量设置一个整数值。

    有东西坏了,所以当我试着做的时候 alert(A); 它回来了 NaN . isNaN(A); 返回true。但是如果我 alert(typeof(A)); 它说 number .

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


    编辑: 多亏了这些答案,我发现我错了,因为:

    • 类型 Number ,
    • 表示“不是数字”,与“不是类型”不同
    • 0/0 是一个很好的例子 :它仍然是一个数字,但是javascript(以及其他任何人)可以说零除以零的实际值是多少。 1/0 另一方面,返回 Infinity ,这不是 .
    6 回复  |  直到 14 年前
        1
  •  19
  •   Andrzej Doyle    14 年前

    据我所知, NaN 是的Sentinel实例 Number 类,它准确地表示它所代表的内容-无法充分表示的数值结果。所以 0/0 不是数字,从这个意义上说 但是 就其类型而言。

    也许它应该被称为NARN(不是一个可代表的数字)。

        2
  •  14
  •   tvanfosson    14 年前

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

        3
  •  1
  •   Janick Bernet    14 年前

    你搞混了 类型 你的目标与 价值 . NaN 是一个特定值,它是一个类型为的对象 number 例如,在零被零除的情况下,或者在试图从不代表数字的字符串转换数字时,可以指定。

        4
  •  1
  •   user347594    14 年前

    W3学校的一些定义:

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

    正无穷大属性表示溢出时返回的无穷大。 负无穷大,表示负无穷大(溢出时返回)。

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

    函数的作用是:确定一个数字是否是有限的合法数字。 如果值为+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
    
        5
  •  0
  •   qw3n    14 年前

    我想,如果你用一个字符串来除,我也会这样说。它试图返回NaN,但仍然将其视为一个数字。

        6
  •  0
  •   Jørgen Fogh    14 年前

    你应该退房 the Wikipedia article . 它有更多的细节。