为什么这段JavaScript代码的while循环会出现无限迭代无法终止的问题?
问题原因
核心原因:NaN的比较规则特殊
JavaScript中NaN是唯一不与自身相等的值,任何涉及NaN的相等/不等比较都会返回固定结果:
NaN == NaN返回falseNaN!= NaN返回true
你写的判断条件parseInt(num[index])!= NaN永远为真,哪怕parseInt返回NaN,判断结果还是满足循环条件,循环会一直执行,甚至index越界变成负数后也不会停止。
额外逻辑说明
你的代码从数组末尾下标4开始向前遍历,当index走到1的时候,num[1]的*被parseInt处理得到NaN,但由于上述判断逻辑问题,条件不会触发终止,反而会继续把num[1]赋值为1,index继续减到0,再到-1、-2……最终进入死循环。
修复方案
使用专门判断NaN的API替换直接比较的逻辑,两种可选写法:
- 全局
isNaN()函数(会自动做类型转换):
var num=["1","*","2","3","4"] var index=4 var eachop=1; while(!isNaN(parseInt(num[index]))){ num[index]=eachop; index=index-1; console.log(index); }
- 更严谨的
Number.isNaN()(不会自动做类型转换,推荐):
while(!Number.isNaN(parseInt(num[index]))){ num[index]=eachop; index=index-1; console.log(index); }
修改后循环到*对应的下标1时,判断条件就会返回false,循环正常终止。
内容的提问来源于stack exchange,提问作者Sathwic
相关产品推荐
相关产品推荐

