我只在Firefox的JavaScript控制台中尝试过,但以下语句都没有返回true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
我只在Firefox的JavaScript控制台中尝试过,但以下语句都没有返回true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.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 customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); }
这背后的逻辑是,除了0和NaN之外的所有数字都被转换为true。
我做了一个快速测试,它的性能和Number一样好。isNaN和as检查自身是否为false。这三个都比isNan表现得好
结果
customIsNaN(NaN); // true
customIsNaN(0/0); // true
customIsNaN(+new Date('?')); // true
customIsNaN(0); // false
customIsNaN(false); // false
customIsNaN(null); // false
customIsNaN(undefined); // false
customIsNaN({}); // false
customIsNaN(''); // false
如果您想避免损坏的isNaN函数,可能会很有用。
使用以下代码:
isNaN('geoff');
参见MDN上的isNaN()文档。
alert ( isNaN('abcd')); // alerts true
alert ( isNaN('2.0')); // alerts false
alert ( isNaN(2.0)); // alerts false
是(NaN >= 0) ?......“我不知道”。
function IsNotNumber( i ){
if( i >= 0 ){ return false; }
if( i <= 0 ){ return false; }
return true;
}
条件仅在TRUE时执行。
不是假的。
不是"我不知道"
alert("1234567890.".indexOf(String.fromCharCode(mycharacter))>-1);
这并不优雅。但在尝试isNAN()后,我得到了这个解决方案,这是另一种选择。在这个例子中,我还允许'。'因为我正在为浮动进行屏蔽。您还可以反转此操作,以确保不使用任何数字。
("1234567890".indexOf(String.fromCharCode(mycharacter))==-1)
这是一个单个字符的求值,但您也可以循环遍历字符串以检查任何数字。
我刚刚在《有效JavaScript》这本书中看到了这个技巧,它非常简单:
因为NaN是唯一被视为与自身不相等的JavaScript值,你总是可以通过检查它是否与自身相等来测试一个值是否为NaN:
var a = NaN;
a !== a; // true
var b = "foo";
b !== b; // false
var c = undefined;
c !== c; // false
var d = {};
d !== d; // false
var e = { valueOf: "foo" };
e !== e; // false
直到@allsyed评论才意识到这一点,但这在ECMA规范中:https://tc39.github.io/ecma262/#sec-isnan-number