Javascript Number.IsNaN()比IsNaN()更坏吗
SoooooJavascript 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,因为它是一个字符串,不能转换为数字。。。然而 似乎我要考虑的事情…不是数字,是真的,不是
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());
}