调用range(1,10)返回NaN数组且循环不终止,及JS类型转换疑问
Hey,咱们来把这两个问题掰扯清楚,都是JavaScript里类型和比较逻辑的常见坑:
问题1:为什么循环会无限执行,一直添加NaN?
首先理清楚核心逻辑:
- 当
third是undefined时,count + undefined会得到NaN——因为JavaScript中数字和undefined相加时,undefined会被隐式转换为NaN,最终结果就是非数字值。 - 循环不终止的关键在于循环条件的判断逻辑:
如果你的循环条件用了不等判断(比如count !== end或者count != end),那NaN和任何值的不等比较结果都是true——因为NaN是JavaScript里唯一不等于自身的值,也不等于任何其他值。举个例子:NaN !== 10的结果是true,所以每次循环条件判断都会通过,循环就会一直跑下去。
而每次循环里,count已经是NaN了,再执行count += third(NaN + undefined)还是NaN,所以数组里就会一直被添加NaN。
如果你的循环条件是count <= end这类范围判断,那NaN和任何数字的比较结果都是false,循环应该只会执行一次(第一次count是初始数字,push后变成NaN,下一次条件判断不通过就终止了)。所以你遇到的无限循环,大概率是用了不等判断的循环条件。
问题2:
typeof third !== 'undefined'判断时,third怎么变回数字类型? 这里你可能误会了:typeof third !== 'undefined'这个判断根本不会把third转换成字符串。typeof是一个操作符,它的作用是返回一个表示变量类型的字符串(比如'undefined'、'number'、'string'),这个判断只是在比较typeof third的返回值(字符串)和'undefined'(字符串)是否不等,完全不会改变third本身的类型。
举个实际的例子:
- 如果你调用
range(1, 10, 2),third是数字2,typeof third返回'number',判断'number' !== 'undefined'为true,这时候third还是数字类型,循环里count += third就是正常的数字相加。 - 如果你调用
range(1, 10),third是undefined,typeof third返回'undefined',判断结果为false,这时候你应该在else分支里给third设置默认值(比如third = 1),把它变成数字类型,这样循环里的相加就是正常的数字运算了。
简单说:typeof只是帮你判断变量是否存在,不会改变变量类型;你看到的“变回数字”,其实是你在判断后给third赋值了数字默认值的结果。
内容的提问来源于stack exchange,提问作者Jahmul14
相关产品推荐
相关产品推荐

