我只在Firefox的JavaScript控制台中尝试过,但以下语句都没有返回true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
我只在Firefox的JavaScript控制台中尝试过,但以下语句都没有返回true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
当前回答
虽然@chiborg的回答是正确的,但还有更多需要注意的地方:
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
重点是,如果你使用这个方法来验证输入,结果将是相当自由的。
所以,是的,你可以使用parseFloat(string)(或在完整数字的情况下parseInt(string, radix)',然后随后用isNaN()包装它,但要注意数字与其他非数字字符交织在一起的问题。
其他回答
如果您的环境支持ECMAScript 2015,那么您可能需要使用Number。isNaN来确保这个值真的是NaN。
isNaN的问题是,如果你将它用于非数值数据,就会应用一些令人困惑的规则(根据MDN)。例如,
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
因此,在ECMA Script 2015支持的环境中,您可能希望使用
Number.isNaN(parseFloat('geoff'))
我刚刚在《有效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
找到了另一种方法,只是为了好玩。
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
相等运算符(==和===)不能用于测试NaN的值。
全局NaN属性是一个表示Not-A-Numbe的值
最好的方法是使用'isNaN()',这是一个内置函数来检查NaN。所有浏览器都支持这种方式。
发现这很有用
// Long-hand const isFalsey = (value) => { if (
value === null ||
value === undefined ||
value === 0 ||
value === false ||
value === NaN ||
value === "" ) {
return true; } return false; };
// Short-hand const
isFalsey = (value) => !value;