Javascript Number.IsNaN()比IsNaN()更坏吗

Javascript Number.IsNaN()比IsNaN()更坏吗,javascript,nan,ecmascript-6,Javascript,Nan,Ecmascript 6,SoooooisNaN显然在JavaScript中被破坏了,比如: isNaN('') isNaN(' ') isNaN(true) isNaN(false) isNaN([0]) 返回false,当它们看起来都是。。。不是一个数字 在ECMAScript 6中,草案中包含了一个新的编号.isNaN,但(imo)看起来这也被破坏了 我希望 Number.isNaN('RAWRRR') 返回true,因为它是一个字符串,不能转换为数字。。。然而 似乎我要考虑的事情…不是数字,是真的,不是

Sooooo
isNaN
显然在JavaScript中被破坏了,比如:

isNaN('')
isNaN('   ')
isNaN(true)
isNaN(false)
isNaN([0])
返回false,当它们看起来都是。。。不是一个数字

在ECMAScript 6中,草案中包含了一个新的
编号.isNaN
,但(imo)看起来这也被破坏了

我希望

Number.isNaN('RAWRRR')
返回true,因为它是一个字符串,不能转换为数字。。。然而

似乎我要考虑的事情…不是数字,是真的,不是,不是数字

MDN上的示例如下:

编号.isNaN(“blabla”);//e、 g.伊斯南也是如此

我不明白这怎么会是“原始全局isNaN的更健壮版本”。当我无法检查事情是否不是一个数字时

这将意味着我们仍然要进行实际的类型检查,以及检查isNaN。。。这看起来很傻

这里的ES3草案基本上说,一切都是假的,除了它的数字。NaN

其他人是否发现这是错误的,或者我只是不理解isNaN的意义?

isNaN()
Number。isNaN()
都测试一个值是否(或者在
isNaN()
的情况下,可以转换为表示
NaN
值的数字类型值。换言之,“NaN”并不仅仅意味着“该值不是一个数字”,它具体意味着“根据IEEE-754,该值是一个数字非数字值”

上述所有测试返回false的原因是,所有给定值都可以转换为非
NaN
的数值:

Number('')    // 0
Number('   ') // 0
Number(true)  // 1
Number(false) // 0
Number([0])   // 0
isNaN()
被“破坏”的原因是,表面上,测试值时不应该发生类型转换。这就是问题所在。
Number.isNaN()
旨在解决这个问题。特别是,
Number.isNaN()
只会尝试将值与
NaN
进行比较,如果该值是数字类型的值。任何其他类型都将返回false,即使它们实际上是“非数字”,因为值
NaN
的类型是数字。有关和,请参阅相应的MDN文档

如果只想确定某个值是否为数字类型,即使该值为
NaN
,也可以使用
typeof

typeof 'RAWRRR' === 'number' // false

否,原来的
isNaN
已损坏。您不理解
isNaN
的要点

这两个函数的目的都是确定某个对象是否具有值
NaN
。这是因为
something===NaN
将始终为
false
,因此无法用于测试此项。 (旁注:
something!==something
实际上是对
NaN
的可靠测试,尽管这与直觉相反)

isNaN
被破坏的原因是,当值实际上不是
NaN
时,它可以返回
true
。这是因为它首先将值强制为数字

所以

真的
,即使
“hello”
不是
NaN

如果要检查某个值实际上是否为有限数,可以使用:

Number.isFinite(value)
Number.isFinite(value) || (Number.isFinite(Number(value)) && typeof value === 'string')
如果要测试值是有限数还是一的字符串表示形式,可以使用:

Number.isFinite(value)
Number.isFinite(value) || (Number.isFinite(Number(value)) && typeof value === 'string')

如注释
isNaN()
Number.isNaN()
中所述,两者都检查传入的值是否不等于值
NaN
。这里的关键是
NaN
是一个实际值,而不是一个评估结果,例如
“blabla”
是一个
字符串
,值是
“blablabla”
,这意味着它不是值
“NaN”

一个可行的解决方案是:

Number.isNaN(Number("blabla")); //returns true.

两者之间的关键区别在于全局
isNaN(x)
函数将参数
x
转换为数字。所以

isNaN("blabla") === true
因为
Number(“blabla”)
导致
NaN

这里有两个“不是数字”的定义,这可能就是混淆的地方
Number.isNaN(x)
仅对IEEE 754浮点规范中非数字的定义返回true,例如:

Number.isNaN(Math.sqrt(-1))
与确定传入的对象是否为数字类型相反。一些方法是:

typeof x === "number"
x === +x
Object.prototype.toString.call(x) === "[object Number]"

基本上,
window.isNaN
执行数字的类型转换,然后检查它是否为NaN。然而,
Number.isNaN
不尝试将其参数转换为数字。因此,基本上,您可以认为
window.isNaN
,和
Number.isNaN
是这样工作的

window.isNaN = function(n){
    return Number(n) !== Number(n);
}

window.Number.isNaN = function(n){
    return n !== n;
}
请注意,您实际上不需要使用
窗口。
来调用
isNaN
Number.isNaN
。相反,我只是用它来更好地区分两个名称相似的方法,以减少混淆


~z~编码快乐

1。编号.isNaN

alert(Number.isNaN('Hello')); // false 
它不应该返回
true
,因为
Hello
是一个
字符串
,而它的
不是一个数字
对吗?但是让我们知道为什么它返回
false

说:

如果给定值为NaN且其类型为Number,则为true;否则,, 错

Hello
值为
NaN
但类型为
string
,您可以按如下方式检查类型:

alert(typeof `Hello`);  // string
用法:

如果要检查值是否同时为
NaN
type
是否为number,请使用此选项

2。伊斯南

alert(isNaN('Hello')); // true
说:

如果给定值为NaN,则为true;否则,错误

用法:

当您想要检查值是否为NaN时使用

3。jQuery.isNumeric()

alert(Number.isNaN('Hello')); // false 
说:

确定其参数是否表示JavaScript编号

用法:

当您希望检查值是否为数字或是否可以转换为数字时使用
function valueIsNaN(value) {
  // eslint-disable-next-line no-self-compare
  return value !== value || typeof value == 'object' && Number.isNaN(value.valueOf());
}