前言

今天在写js代码的时候,遇到一个小问题,也在百度上找了好半天,好像没有一模一样的解答,最后在一些大佬的关于NaN详解的文章里找到了答案,所以我想记录一下这次问题

下面这段是课堂上老师写的代码

1
2
3
4
5
var str = input.value;

if(Number(str.charAt(0))){
infoUserName.innerHTML = "不能以数字开头";
}

这段代码,执行时候是完全没有问题的,输入以数字开头的字符串,就会执行代码,出现提示。后来我再来看这段代码,就发现if中的判定条件是将第一个字符转化为数值,转化不了则会返回NaN,然后我就在想,无论转化后是数字还是NaN,都if无关,那么是怎么判断是否要执行代码的,于是,我将代码改了下,改成下面这样了。

1
2
3
4
5
var str = input.value;

if(Number(str.charAt(0)) != NaN){
infoUserName.innerHTML = "不能以数字开头";
}

从我认为来看,这样是完全合理的,判断转化值是否不等于NaN,这样他就会出现一个ture或者false,但是出现问题了,无论我输入是不是数字开头的字符串,都会出现提示。难道是数字、字母转化出来都为NaN?不可能吧,带着疑惑,我又写了下面这串代码来验证

1
2
3
4
5
6
7
window.onload = init;

function init(){
var str = "sssssss";
var x = Number(str.charAt(0));
console.log(x);
}

控制台返回的结果为NaN,没错啊,为什么判定的时候就出问题了,我开始百度,找寻答案,最后问题解决了,从大佬们的文章中我知道了NaN要严格地来说它的类型依旧是Number型,但是它跟任何数字或者字符(包括它自己)相比较得到的结果都会是false,我理解为,它本身就有false的性质,所以当我输入字符时,他不会执行代码。