Javascript检查NaN-结果不符合预期

Javascript检查NaN-结果不符合预期,javascript,nan,Javascript,Nan,我有一个通过ajax读取数字的应用程序,数字是十六进制的,我对它进行解析并转换为十进制 这些数字是通过无线串行链路输入的,不是100%可靠,因此我需要在开始处理数据之前检查它们。例如,数字的格式为*****025781610403e5****。***只是一种检查数字的开始和结束的方法,我过去在非基于web的项目中使用过,并且可以更改 不管怎样,最后我的问题是:作为错误检查的一部分,我想我会检查NaN,因为我在测试时确实会收到NaN错误,但是虽然*1234给出了一个正的NaN12**34没有,为什

我有一个通过ajax读取数字的应用程序,数字是十六进制的,我对它进行解析并转换为十进制

这些数字是通过无线串行链路输入的,不是100%可靠,因此我需要在开始处理数据之前检查它们。例如,数字的格式为
*****025781610403e5****
***
只是一种检查数字的开始和结束的方法,我过去在非基于web的项目中使用过,并且可以更改

不管怎样,最后我的问题是:作为错误检查的一部分,我想我会检查NaN,因为我在测试时确实会收到NaN错误,但是虽然
*1234
给出了一个正的NaN
12**34
没有,为什么?我还能做些什么来测试呢

下面是我使用过的一些代码,请注意我对javascript相当陌生

function readSliceConvert()
{
    functionReadForm()
    testVal = hexString.slice(4,18);
    document.getElementById("battDb4").innerHTML=testVal;
    testNum1 = h2d(testVal)
    document.getElementById("battDb5").innerHTML=testNum1.toString();
    testNum2 = parseInt(testVal);
    document.getElementById("battDb6").innerHTML=testNum2.toString();
    if (isNaN(testNum2))
    {
        errorCount++;
        document.getElementById("battDb3").innerHTML=errorCount.toString();
        document.getElementById("battDb4").innerHTML=testVal;

        return;
    }
}

您会看到奇怪的行为,因为(有关详细信息,请参阅mozilla文档)

测试数据格式是否正确的更好方法是使用快速正则表达式,如
serial.test(/^\d+$/)
,如果整个序列都是数字,则会成功;或者
serial.test(/^\*{4}\d+\*{4}$/)
,如果序列是四个星号,后跟一个或多个数字,则会成功,后面跟着另外四个星号

更新:@Guffa的答案是正确的,应该被接受,但我将把它留在这里,因为我认为在更大的范围内有一个有效的论点,即你可以更好地完成你试图用正则表达式做的事情

在字符串上运行将执行提供的正则表达式,如果它与字符串匹配,则返回
true


正则表达式只是描述文本的模式,它可以非常复杂,也可以像我给出的示例一样简单(
\d+
意味着匹配一个数字(
\d
)一次或多次(
+
),开头(
^
)和结尾(
$
)表示我们希望匹配整个字符串,而不仅仅是其中的一部分。它们非常有用,因此几乎肯定值得花时间学习它们的基本工作原理,并随着时间的推移扩展您的知识。有一个很好的教程可以让您很快开始使用。

这是因为您正在使用
解析Int
,当字符串开头有一些数字可以解析时,它将自动忽略字符串末尾的字符

我不知道您的
h2d
函数在做什么,但似乎您正在将十六进制字符串转换为数字,然后转换为十进制形式的字符串,然后再转换回数字。我看不出解析十六进制字符串的输出不能是数字的任何原因

例如,如果解析失败,则返回null:

function h2i(str) {
  var num = 0;
  var digits = "0123456789abcdef";
  str = str.toLowerCase();
  for (var i = 0; i < str.length; i++) {
    var n = digits.indexOf(str.substr(i, 1));
    if (n == -1) return null;
    num = num * 16 + n;
  }
  return num;
}
你知道parseInt()做什么吗

parseInt是一个顶级函数,与任何 反对

parseInt函数将其第一个参数转换为字符串parses ,并返回一个整数或NaN。如果不是NaN,则返回的值将 是第一个参数的十进制整数表示形式 以指定的基数(基数)表示的数字。例如,基数为10 指示从十进制数、8八进制数、16十六进制数进行转换, 以此类推。对于大于10的半径,字母表中的字母表示 大于9的数字。例如,对于十六进制数(基数 16) ,使用A到F

如果parseInt遇到的字符不是 指定的基数,则忽略该基数及其所有后续字符和 返回解析到该点的整数值。parseInt截断 将数字转换为整数值。允许使用前导空格和尾随空格

在控制台中运行代码

console.log( parseInt("12**34",10) );  
因为parseInt返回12,所以您正在针对一个数字运行isNaN

将*作为第一个字符时,没有要返回的前导数字

console.log( parseInt("*1234",10) );  

isNaN('12**34')==true
&
isNaN('*1234')==true
isNaN('12**34'));
返回true,您有其他问题。不,
isNaN
只有在您不知道向其中发送什么时才会出现混乱的结果。在这种情况下,它始终是
parseInt
的结果,因此值的类型是已知的,并且使用
isNaN
没有问题。我不会说
isNaN
==
=
更坏它只是有一些你需要理解的怪癖。错过了他的代码中的
parseInt
,很好。我仍然认为他的技术不是最好的,但你是对的。@Chad也许,但是怪癖和bug之间有一条非常细微的界线。Mozilla描述b将其视为已损坏,并且行为已损坏/古怪到有时无法预测的程度,因此作为一项规则,我倾向于建议不要使用它。@Kelvin Mackay serial.test(/^*{4}\d+*{4}$/)-这看起来很好/有趣,但我不知道它在做什么,或者它是如何做的。感谢代码示例,我正在尝试这一点,不太确定发生了什么,但已经实现了,正如我所说的,我是新手。@Simon_A:我在上面添加了一个用法示例,希望它能有所帮助。谢谢,我刚刚了解了console.log的功能,我是我对这件事还不熟悉;)
console.log( parseInt("*1234",10) );