为什么我的JavaScript出现NaN问题,下述JS函数为何未返回0?
JS函数未返回0的问题排查
核心问题代码
let letters = [ 3, 1, "c" ]; const easySolution = function(input){ if(Math.max(...input) === NaN){ return 0; }else{ return Math.max(...input); } } console.log(easySolution(letters));
问题根因
- NaN的等值判断逻辑错误:NaN是JavaScript中唯一和自身不相等的特殊值,
NaN === NaN的执行结果为false,因此代码中的判断条件Math.max(...input) === NaN永远不会成立,永远不会进入返回0的分支。 - Math.max返回NaN的原因:当Math.max接收的参数中存在无法转换为有效数字的值时,整体返回结果为NaN。示例数组中存在字符串
"c",转换为数字的结果是NaN,因此Math.max(...letters)最终返回NaN,而因为判断条件失效,函数直接把这个NaN作为返回值输出。
修复方案
将NaN的判断逻辑替换为Number.isNaN()方法,同时可以将Math.max的结果存入变量避免重复计算,修改后代码如下:
let letters = [ 3, 1, "c" ]; const easySolution = function(input){ const maxResult = Math.max(...input); // 用Number.isNaN判断值是否为NaN,该方法不会做隐式类型转换,判断结果更准确 if(Number.isNaN(maxResult)){ return 0; } return maxResult; } console.log(easySolution(letters)); // 输出0,符合预期
内容的提问来源于stack exchange,提问作者Peter Mingione
相关产品推荐
相关产品推荐

