JavaScript中NaN行为异常:字符串'1'未被过滤的原因解析
这是JavaScript里一个超经典的类型转换坑,我来给你掰扯清楚:
问题出在
isNaN()的「隐式类型转换」特性 你写的isNaN(x)根本不是直接判断x是不是非数字——它的逻辑是:先把传入的参数强制转换成数字,再判断转换后的结果是不是NaN。
举个例子,当你传入字符串'1'时:
isNaN('1')会先把'1'转成数字1- 然后判断
1是不是NaN,结果是false
所以函数里的if (isNaN(x))条件不成立,直接返回了原参数'1'(你看到控制台输出1,大概率是浏览器console自动把字符串数字显示成了数字格式,本质函数返回的还是字符串类型的'1')。
而你传入'NotANumber'时,它会被转成NaN,所以isNaN('NotANumber')返回true,函数就返回NaN,这符合你的预期。
怎么修复?实现你要的「仅数字类型返回原值」逻辑
要达到你想要的效果——只有当参数是数字类型且为有效数字时返回原值,否则返回NaN——有两种靠谱的方法:
方法1:用ES6的Number.isNaN()(推荐)
Number.isNaN()不会搞隐式类型转换,它只判断传入值本身是不是NaN,再结合typeof判断类型:
function sanitise(x) { // 先排除非数字类型,再排除数字类型里的NaN if (typeof x !== 'number' || Number.isNaN(x)) { return NaN; } return x; }
测试结果完全符合预期:
sanitise(1)→1sanitise('1')→NaNsanitise('NotANumber')→NaN
方法2:兼容旧环境的写法
如果要支持ES6之前的老浏览器,可以先判断类型,再用传统的isNaN:
function sanitise(x) { if (typeof x !== 'number' || isNaN(x)) { return NaN; } return x; }
先把非数字类型的参数直接过滤,剩下的数字类型再用isNaN检查是不是无效数字。
额外提一句
如果你其实想的是「允许可以转成数字的字符串,比如'1'返回1,'abc'返回NaN」,那逻辑就要换,但根据你的描述,你要的是严格的数字类型校验,上面两种方法就够了。
内容的提问来源于stack exchange,提问作者Arun K
相关产品推荐
相关产品推荐

