为何isNaN('blabla')返回true被判定为false positive?存疑咨询
关于MDN中isNaN例子的疑问解答
这个问题的核心其实是对isNaN()函数的命名和实际行为的误解,咱们一步步拆解清楚:
为什么MDN说isNaN('blabla')是false positive?
首先得明确这里“false positive”的语境:
isNaN()的名字非常容易让人误以为它的作用是判断某个值“是不是一个非数字(Not-a-Number)”,但它的实际逻辑完全不是这样:它会先把传入的参数强制转换为Number类型,再检查转换后的结果是否是NaN。- 这里的“false positive”是站在「判断值本身是否为
NaN这个特殊值」的角度来说的:'blabla'本身是一个字符串,根本不是NaN,但isNaN('blabla')返回了true——相当于把一个非NaN的值误判成了“是NaN”,所以被称为false positive。
回应你的疑问:'blabla'确实不是数字,为什么说这个例子能说明isNaN不可靠?
你说'blabla'不是数字这点完全没错,但MDN举这个例子的目的是吐槽isNaN()的命名误导性:
- 如果你用它来判断「某个值能不能被转换成合法数字」,那
isNaN('blabla')返回true是合理的;但如果用户按照函数名的字面意思,想用它来判断「某个值本身是不是NaN」,那这个结果就完全错误了。 - 正是因为这种命名和实际行为的脱节,才让
isNaN()显得“不完全可靠”——很多人会被名字坑,用它做了错误的判断。
正确的判断方式
如果想准确判断一个值本身是不是NaN,应该使用ES6引入的Number.isNaN(),它不会做任何类型转换:
Number.isNaN('blabla')→ 返回false(因为这个字符串不是NaN)Number.isNaN(NaN)→ 返回true(准确识别NaN)
而如果只是想判断一个值能不能转换成合法数字,其实也可以用Number.isFinite(),或者结合类型检查来实现更清晰的逻辑。
内容的提问来源于stack exchange,提问作者ZerosAndOnes
相关产品推荐
相关产品推荐

