可以避免在JavaScript中对isNaN()函数进行内部数字转换

Is possible avoid internal number conversion on isNaN() function in JavaScript?

本文关键字:内部 数字 转换 函数 JavaScript 中对 isNaN 可以避免      更新时间:2023-09-26

正如问题的标题所说,我希望避免isNaN()函数的内部数字转换。

isNaN()函数试图将输入参数转换为调用number()函数的数字。

例如,如果用户在输入文本中放入值false,并使用isNaN()函数进行测试,以查看输入数据是否"不是数字",则结果将为"false",因为number()函数会将值false转换为0。

那么,有可能这样做吗?例如,使用杂注或其他什么?

谢谢!

Number.isNaN()函数的工作方式与全局isNaN()不同。Number.isNaN()不执行类型强制。

现在,理解概念NaN的含义很重要。它不仅仅意味着"不是数字的东西"。这是关于浮点系统,特别是那些没有任何意义的值。如果你想检查某个未知值是否是数字,有更好的方法。isNaN函数实际上是关于数字的。

一个简单的测试:

function isNumberReally( n ) {
  return n === Number(n);
}

它使用Number构造函数来执行转换(如果可以的话)。然后,它使用无转换===运算符检查结果是否与原始结果相比较。只有真正的原始数才能通过测试;像"123"这样的字符串不会。

确实没有办法阻止isNan进行类型转换;Javascript会自动执行此操作。但是,您可以尝试根据要检查的字符串创建一个新的Number(),如下所示:

var a=false;
isNaN(Number(String(a)));//returns true;

或者你可以检查某个东西是否等于它的等价数字,比如

return num===Number(num);

其在检查等价性时基本上不转换类型。

如果您对其他事物持开放态度,您可以始终使用typeof num==="number";

isNaN函数只在已经是数字类型的东西上可靠地工作。如果你给它任何其他类型的,它会给出与你自然预期不一致的结果。

将字符串解析为一个数字,然后可以对其使用isNaN函数。解析可以得到一个数字或值NaN(也是数字类型),isNaN可以从中得到一致的结果。示例:

if (isNaN(parseFloat(textbox.value))) {
  alert('oops');
}

但是,请注意,解析只会愉快地解析部分值。如果有人输入类似123abc的值,则parseFloat调用将返回数字123

如果您希望输入只包含一个数字,而不包含其他内容,则需要对其进行验证。例如,使用只接受数字的正则表达式:

if (/^'d+$/.test(textbox.value)) {
  alert("fine");
}