使用parseFloat转换后求和仍返回NaN的技术问题求助
JavaScript数值求和NaN问题解决
问题根源
你的第四个属性freshsnow_single_resort.fs_ski_resort_aa_extreme_length是空白无值,parseFloat()处理空字符串/无值时会返回NaN。JavaScript中只要算术运算包含NaN,整个运算结果就会是NaN——这就是你最终得到NaN的原因。另外注意:typeof NaN返回的是Number,所以用typeof检测不出来变量实际是NaN。
修复方案
给每个parseFloat()的结果设置默认值0,避免出现NaN;同时求和时不需要再套parseFloat()(前面已经把变量转成数值类型了)。
修改后的代码:
console.log(freshsnow_single_resort.fs_ski_resort_aa_advanced_length); console.log(freshsnow_single_resort.fs_ski_resort_aa_expert_length); console.log(freshsnow_single_resort.fs_ski_resort_aa_freeride_length); console.log(freshsnow_single_resort.fs_ski_resort_aa_extreme_length); // 给每个parseFloat结果设置默认值0,避免NaN let fs_ski_resort_aa_advanced_length = parseFloat(freshsnow_single_resort.fs_ski_resort_aa_advanced_length) || 0; let fs_ski_resort_aa_expert_length = parseFloat(freshsnow_single_resort.fs_ski_resort_aa_expert_length) || 0; let fs_ski_resort_aa_freeride_length = parseFloat(freshsnow_single_resort.fs_ski_resort_aa_freeride_length) || 0; let fs_ski_resort_aa_extreme_length = parseFloat(freshsnow_single_resort.fs_ski_resort_aa_extreme_length) || 0; // 直接求和,无需再用parseFloat let expert_km = fs_ski_resort_aa_advanced_length + fs_ski_resort_aa_expert_length + fs_ski_resort_aa_freeride_length + fs_ski_resort_aa_extreme_length; console.log(Number.isNaN(fs_ski_resort_aa_advanced_length)); console.log(Number.isNaN(fs_ski_resort_aa_expert_length)); console.log(Number.isNaN(fs_ski_resort_aa_freeride_length)); console.log(Number.isNaN(fs_ski_resort_aa_extreme_length)); console.log(expert_km);
补充说明
- 如果担心
0本身会被|| 0覆盖(比如属性值确实是0),可以用更严谨的判断:let val = parseFloat(xxx); let finalVal = Number.isNaN(val) ? 0 : val; Number.isNaN()是检测是否为NaN的可靠方法,比全局isNaN()更准确,因为全局isNaN()会先把非数值类型转成数值再判断。
内容的提问来源于stack exchange,提问作者spreaderman
相关产品推荐
相关产品推荐

