为什么angular.isNumber(NaN)返回true?

时间:2015-07-17 22:00:47

标签: javascript angularjs nan

NaN代表非数字。

看起来angular.isNumber认为它是一个数字。 (angularjs 1.4.2) 为什么angular.isNumber对于NaN输入返回true?

感谢

6 个答案:

答案 0 :(得分:3)

引用IgorMinar,Angular Developer的确切question

$ node
> typeof NaN
'number'
     

如果你双眼眯眼并插上你的眼睛,这是有道理的   耳朵。

     

如果您故意在应用中使用NaN,则应使用isNaN   angular.isNumber。

     

我倾向于说当前的行为,即使有点   令人惊讶的是,与在javascript中处理NaN的方式一致。   如果您有一些改变行为的好参数请分享   他们和我们在一起。

所以问题实际上是javascript标准本身不适用于Angular

要回答这个问题,我们必须转到ECMAScript 5 specification of number type,当然它会说:

  

4.3.20号码类型

     

设置所有可能的数字值,包括特殊的“非数字”   (NaN)值,正无穷大和负无穷

     

4.3.23 NaN

     

数值,即IEEE 754“非数字”值

所以是的,根据最新的ECMAScript Specification我是一个数字

答案 1 :(得分:1)

这是我能想到解释这个问题的最佳方式。

虽然NaN的值代表的某些不是数字,但值NaN本身仍然是数字类型(在类型系统感)。

它也是IEEE 754中浮点数的定义值,这是JavaScript用于数字的。值无穷大和NaN是数字类型是明智的。

答案 2 :(得分:1)

ECMA spec将NaN定义为IEEE 754 Not-a-Number数字值。 NaN global为数字的一个原因是比较目的。还需要表示未定义的数值结果,例如Math.sqrt(-1)的值。所以它并不特别针对AngularJS。请考虑以下事项:

typeof NaN === "number"   // true
typeof NaN === typeof NaN // true
typeof NaN === typeof 123 // true
NaN === NaN  // false
isNaN(NaN)   // true
isNaN(123)   // false
isNaN('123') // false
isNaN('|23') // true

因此isNumber NaN返回true Number。要检查数字,请使用isNaN()

答案 3 :(得分:0)

它与角度无关,它是JavaScript 试试这个

typeof NaN

它将返回number

答案 4 :(得分:0)

很可能angular只使用你传入的类型。如果类型是数字,那么它返回true。

如果您想知道某些内容是否为数字(不包括NaN),您可以执行以下操作。

function isNumber(val){
  return angular.isNumber(val) && (val == val);
}

首先确定val是否为数字。如果检查它是否是NaN。

NaN不等于它自己(或任何其他数字)。

答案 5 :(得分:0)

"数字"有两个含义。这里:

  • 缩写" NaN"意味着对特定的数学运算没有有意义的答案;你可以说"没有这样的号码"
  • 然而,像JS这样的语言中的每个值都有一个类型,进出数学运算的数据类型在JS中称为" number&#34 ;;因此,当JS想要一个特殊值来表示数学运算没有答案时,该特殊值是一个特殊的数字

请注意,这种明显的矛盾在其他语言中不太明显,因为JS只有一种数字类型,而不是(至少)整数和实数/浮点类型。将NaN作为浮点值是几乎所有现代语言的标准,但由于单词" number",它在JS中似乎更令人惊讶。

Angular函数是用于测试值类型的一组实用程序之一。 The documentation for it提到它对于无穷大和NaN都返回true,并指向标准isFinite函数,以确定何时不可取。