Soooooo isNaN
显然在JavaScript中被破坏了,例如:
isNaN('')
isNaN(' ')
isNaN(true)
isNaN(false)
isNaN([0])
返回false,当它们看起来都是......不是数字......
在ECMAScript 6中,草案包含一个新的Number.isNaN
,但看起来像(imo)这个也被打破了......
我希望
Number.isNaN('RAWRRR')
要返回true,因为它是一个字符串,并且无法转换为数字......但是......
似乎我会考虑的事情......不是数字,确实不是,不是数字......
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-isfinite-number
MDN上的例子说:
Number.isNaN( “布拉布拉”); //例如isNaN
就是这样
我不明白这是“原始全球isNaN的更强大版本”。当我无法检查事情是否不是一个数字。
这意味着我们仍然需要进行实际的类型检查以及检查isNaN ......这看起来很傻......
http://people.mozilla.org/~jorendorff/es6-draft.html#sec-isnan-number
这里的ES3草案基本上说,一切都是假的,除了它的Number.NaN
是否有其他人发现这已经破裂或者我只是不理解isNaN的观点?
答案 0 :(得分:80)
isNaN()
和Number.isNaN()
都会测试值是否为(或者在isNaN()
的情况下,可以转换为表示的数字类型值){{1}价值。换句话说," NaN"并不仅仅意味着"这个值不是数字",它具体表示"根据IEEE-754&#34,该值是数字非数字值;
上述所有测试返回false的原因是因为所有给定值都可以转换为非NaN
的数值:
NaN
Number('') // 0
Number(' ') // 0
Number(true) // 1
Number(false) // 0
Number([0]) // 0
被打破的原因"是因为,表面上看,类型转换不应该在测试值时发生。这是isNaN()
旨在解决的问题。特别是,如果值为数字类型值,则Number.isNaN()
仅 会尝试将值与Number.isNaN()
进行比较。任何其他类型都将返回false,即使它们字面上是"而不是数字",因为值NaN
的类型是数字。请参阅isNaN()
和Number.isNaN()
的相应MDN文档。
如果您只是想确定一个值是否属于数字类型,即使该值为NaN
,请改为使用NaN
:
typeof
答案 1 :(得分:18)
不,原来的isNaN
已被破坏。你不理解isNaN
。
这两个函数的目的是确定某些东西是否具有值NaN
。这是因为something === NaN
将始终为false
,因此无法用于测试此问题。
(旁注:something !== something
实际上是NaN
)的可靠但反直觉的测试
isNaN
被破坏的原因是,如果某个值实际上不是true
,它可以返回NaN
。这是因为它首先将值强制转换为数字。
所以
isNaN("hello")
是true
,即使"hello"
不是NaN
。
如果要检查某个值是否实际为有限数,可以使用:
Number.isFinite(value)
如果要测试值是有限数字还是字符串表示形式,可以使用:
Number.isFinite(value) || (Number.isFinite(Number(value)) && typeof value === 'string')
答案 2 :(得分:7)
两者之间的主要区别在于全局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]"
答案 3 :(得分:5)
正如评论isNaN()
和Number.isNaN()
中所述,都会检查您传入的值是否不等于值NaN
。这里的关键是NaN
是实际值而不是评估结果,例如"blabla"
是String
,值为"blabla"
,这意味着它不是值"NaN"
。
一个看似合理的解决方案就是:
Number.isNaN(Number("blabla")); //returns true.
答案 4 :(得分:3)
基本上,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;
}
请注意,您实际上并不需要使用window.
来致电isNaN
或Number.isNaN
。相反,我只是用它来更好地区分两个同名的方法,试图减少混淆。
〜快乐编码!
答案 5 :(得分:1)
<强> 1。 Number.isNaN
alert(Number.isNaN('Hello')); // false
不应该返回true
,因为Hello
是string
而Not A Number
对吗?但是让我们知道为什么它会返回false
。
MDN docs说:
如果给定值为NaN且其类型为Number,则为true;否则为false。除此以外, 假的。
是Hello
值为NaN
,但类型为string
,您可以按以下方式检查类型:
alert(typeof `Hello`); // string
<强>用法:强>
当您要检查值NaN
和type
是否为数字时使用。
<强> 2。 isNaN 强>
alert(isNaN('Hello')); // true
MDN docs说:
如果给定值为NaN,则为true;否则,错误。
<强>用法:强>
当你想检查价值只是NaN时使用。
第3。 jQuery.isNumeric()
确定其参数是否代表JavaScript编号。
alert($.isNumeric('Hello')); // false
alert($.isNumeric(3)); //true
<强>用法:强>
当您想要检查值是一个数字还是可以转换为数字时使用。
答案 6 :(得分:1)
下面的方法起作用,因为NaN是javascript中唯一不等于其自身的值。
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
答案 7 :(得分:1)
Per,MDN,it (NaN) is the returned value when Math functions fail,因此是一个特定值。也许更好的名字是function isNumber(v) {return Number.isNaN(parseFloat(v)); }
。
要确定某物是否为数字,需要进行解析,该解析在很宽的非数字输入范围内会失败,从而成功检测到数字和表示数字的字符串,因此:
siteFeeds = activityService.getSiteFeedEntries("testSite");
答案 8 :(得分:1)
Number.isNaN(x)
检查x是否直接评估为NaN
。
RAWR
与NaN
不同。可以将NaN
视为代表某些数学计算结果的实体,而计算机不知道该数字如何表示。
数学运算不会产生非数值结果,因此typeof
NaN
是number
。
字符串RAWR
没有经过任何数学运算即可得出NaN
。但是,如果您要呼叫Number.isNaN(+'RAWR')
,则将导致NaN
,因为一元+
运算符正在尝试将'RAWR'
转换为数字。
另一方面,isNaN(y)
告诉y
是否可以转换为数字。如果isNaN(y)
为false
,则y
可以转换为数字。但是如果isNaN(y)
为真,则y
不能不能转换为数字。
一个好的经验法则是:
x
是否可以成功转换为数字?在这种情况下,请使用isNaN(x) == false
。转换失败会导致NaN
。x
是否被评估为NaN
?为此使用Number.isNaN(x) == true
。答案 9 :(得分:0)
@phill都没有损坏。
Number.isNaN
处理Number
的数字或实例,因此即使Number.isNaN(new Date(NaN))
也是错误的。
isNaN
是通用的,它会在检查参数之前尝试将其参数转换为数字。
如果要确定某个值是否为{或包含NaN
,可以使用此功能:
function valueIsNaN(value) {
// eslint-disable-next-line no-self-compare
return value !== value || typeof value == 'object' && Number.isNaN(value.valueOf());
}
答案 10 :(得分:0)
我使用一种简单的解决方法来检查Number.isNaN():
let value = 'test';
Number.isNaN(-value); // true
value = 42;
Number.isNaN(-value); // false
js尝试将值转换为负数,如果转换失败-我们有NaN。
简单,不是吗?
此外,在线基准测试表明Number.isNaN比isNaN轻。