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

Javascript 为什么angular.isNumber(NaN)返回true?,javascript,angularjs,nan,Javascript,Angularjs,Nan,NaN表示非数字 似乎angular.isNumber认为它是一个数字。(angularjs 1.4.2) 为什么angular.isNumber对于NaN输入返回true 谢谢它与angular无关,它是JavaScript 试试这个 它将返回number很可能只是使用您传入的内容的类型。如果类型为number,则返回true 如果你想知道某件事是否是一个数字(不包括NaN),你可以做以下事情 function isNumber(val){ return angular.isNumber(

NaN表示非数字

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


谢谢

它与angular无关,它是
JavaScript
试试这个


它将返回
number

很可能只是使用您传入的内容的类型。如果类型为number,则返回true

如果你想知道某件事是否是一个数字(不包括NaN),你可以做以下事情

function isNumber(val){
  return angular.isNumber(val) && (val == val);
}
这是通过首先确定val是否是一个数字来实现的。如果是,检查是否是NaN


NaN不等于它本身(或任何其他数字)。

以下是我能想到的最好的解释方法

尽管
NaN
的值表示的不是数字,但值
NaN
本身仍然是数字类型(在类型系统意义上)


它也是IEEE 754中浮点数的定义值,JavaScript使用浮点数表示数字。值infinity和NaN是数字类型,这是明智的

这里的“数字”实际上有两种含义:

  • 缩写“NaN”意味着对特定的数学运算没有有意义的答案;你可以说“没有这样的数字”
  • 然而,像JS这样的语言中的每个值都有一个类型,在JS中,进出数学运算的数据类型称为“数字”;因此,当JS想要一个特殊值来表示数学运算没有答案时,这个特殊值就是一个特殊的数字
请注意,这种明显的矛盾在其他语言中不太明显,因为JS只有一种数值类型,而不是(至少)整数和实/浮点类型。在几乎所有现代语言中,NaN作为浮点值都是标准值,但由于“number”一词的存在,在JS中似乎更令人惊讶

角度函数是用于测试值类型的一组实用程序之一。提到它对于无穷大和NaN返回true,并指出标准的
isFinite
函数,用于不需要的情况。

引用Angular Developer,具体如下:

如果你眯起双眼,塞住眼睛,这是有道理的 耳朵

如果您在应用程序中故意使用NaN,则应改用isNaN 关于角数

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

所以问题是javascript标准本身,而不是角度

为了回答这个问题,我们必须去,当然它说:

4.3.20数字类型

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

4.3.23 NaN

数值这是IEEE 754“非数字”值

因此,是的,根据最新的《我是一个数字》

将NaN定义为IEEE 754非数字值。作为一个数字的一个原因是比较的目的。它还需要表示未定义的数值结果,如
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
。要检查数字,请使用。

向我们展示完整的代码示例,以便我们能提供更多帮助。如果不是数字,NaN还会是什么?伙计,我完全是一个数字。非常相关:这里很容易找到最好的答案-你很少能够以“我在使用库,为什么它会这样?”的形式明确回答问题+1OMFG@NaN你真是一个数字,我不明白这里面有什么困惑谢谢你的详细回答用户名签出
$ node
> typeof NaN
'number'
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