我只在Firefox的JavaScript控制台中尝试过,但以下语句都没有返回true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
我只在Firefox的JavaScript控制台中尝试过,但以下语句都没有返回true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
当前回答
找到了另一种方法,只是为了好玩。
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
其他回答
要修复'1.2geoff'被解析的问题,只需使用Number()解析器即可。
所以与其这样:
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
这样做:
Number('1.2geoff'); // => NaN
isNaN(Number('1.2geoff')); // => true
isNaN(Number('.2geoff')); // => true
isNaN(Number('geoff')); // => true
编辑:我刚刚注意到另一个问题…传入Number()的false值(true为实布尔值)返回为0!那样的话……相反,parseFloat每次都有效。所以回到这个问题:
function definitelyNaN (val) {
return isNaN(val && val !== true ? Number(val) : parseFloat(val));
}
这似乎涵盖了一切。我测试它比lodash的_慢90%。是NaN,但它并没有涵盖所有的NaN:
http://jsperf.com/own-isnan-vs-underscore-lodash-isnan
只是为了澄清,我的关心人类字面解释的东西是“不是一个数字”和lodash的关心计算机字面解释的检查,如果什么是“NaN”。
找到了另一种方法,只是为了好玩。
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
似乎在Node.js中,isNaN()是不被开箱即用的。 我曾经和
var value = 1;
if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);
NaN在JavaScript中代表“不是一个数字”,尽管它的类型实际上是数字。
typeof(NaN) // "number"
要检查一个变量的值是否为NaN,我们不能简单地使用函数isNaN(),因为isNaN()有以下问题:
var myVar = "A";
isNaN(myVar) // true, although "A" is not really of value NaN
这里真正发生的是myVar被隐式地强制为一个数字:
var myVar = "A";
isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact
这是有道理的,因为A实际上不是一个数字。但我们真正想检查的是myVar的值是否为NaN。
因此isNaN()无法提供帮助。那我们该怎么办呢?
鉴于NaN是唯一被视为与自身不相等的JavaScript值,因此我们可以使用!==来检查它是否与自身相等
var myVar; // undefined
myVar !== myVar // false
var myVar = "A";
myVar !== myVar // false
var myVar = NaN
myVar !== myVar // true
所以总结一下,如果一个变量!==本身是正确的,那么这个变量的值正好是NaN:
function isOfValueNaN(v) {
return v !== v;
}
var myVar = "A";
isNaN(myVar); // true
isOfValueNaN(myVar); // false
我使用下划线的isNaN函数,因为在JavaScript中:
isNaN(undefined)
-> true
至少,要意识到这一点。