Number.IsNaN()比isNaN()更破碎

时间:2014-08-07 07:22:39

标签: javascript nan ecmascript-6

Soooooo isNaN显然在JavaScript中被破坏了,例如:

isNaN('')
isNaN('   ')
isNaN(true)
isNaN(false)
isNaN([0])

返回false,当它们看起来都是......不是数字......

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

我希望

Number.isNaN('RAWRRR')

要返回true,因为它是一个字符串,并且无法转换为数字......但是......

enter image description here

似乎我会考虑的事情......不是数字,确实不是,不是数字......

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的观点?

11 个答案:

答案 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.isNaNNumber.isNaN就像这样工作。

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

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

请注意,您实际上并不需要使用window.来致电isNaNNumber.isNaN。相反,我只是用它来更好地区分两个同名的方法,试图减少混淆。

〜快乐编码!

答案 5 :(得分:1)

<强> 1。 Number.isNaN

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

不应该返回true,因为HellostringNot A Number对吗?但是让我们知道为什么它会返回false

MDN docs说:

  

如果给定值为NaN且其类型为Number,则为true;否则为false。除此以外,   假的。

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

alert(typeof `Hello`);  // string

<强>用法:

当您要检查值NaNtype是否为数字时使用。

<强> 2。 isNaN

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

MDN docs说:

  

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

<强>用法:

当你想检查价值只是NaN时使用。

第3。 jQuery.isNumeric()

Jquery Docs说:

  

确定其参数是否代表JavaScript编号。

alert($.isNumeric('Hello')); // false
alert($.isNumeric(3)); //true

<强>用法:

当您想要检查值是一个数字还是可以转换为数字时使用。

Reference

答案 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

RAWRNaN不同。可以将NaN视为代表某些数学计算结果的实体,而计算机不知道该数字如何表示。

数学运算不会产生非数值结果,因此typeof NaNnumber

字符串RAWR没有经过任何数学运算即可得出NaN。但是,如果您要呼叫Number.isNaN(+'RAWR'),则将导致NaN,因为一元+运算符正在尝试将'RAWR'转换为数字。

另一方面,isNaN(y)告诉y是否可以转换为数字。如果isNaN(y)false,则y可以转换为数字。但是如果isNaN(y)为真,则y不能不能转换为数字。

一个好的经验法则是:

  1. 我是否要检查x是否可以成功转换为数字?在这种情况下,请使用isNaN(x) == false。转换失败会导致NaN
  2. 我是否要检查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轻。