为何在array.map中使用parseInt处理IP拆分数组会返回异常值?
为什么parseIP函数返回[0, NaN, 0, 0]?
先看你写的代码:
function parseIP(str) { octets = str.split('.'); console.log(octets); return octets.map(parseInt); } console.log(parseIP("0.0.0.0"));
问题出在Array.map()和parseInt()的参数传递逻辑上:
map()会给回调函数传递三个参数:当前遍历的元素、元素的索引、原数组parseInt()接受两个参数:要解析的字符串,以及基数(radix)——也就是解析时使用的进制数,合法范围是2到36
当你直接把parseInt传给map时,实际执行的是这四次调用:
parseInt("0", 0):基数为0时,parseInt会默认按十进制解析"0",返回0parseInt("0", 1):基数1属于无效进制,直接返回NaNparseInt("0", 2):基数2是二进制,"0"是合法二进制数,返回0parseInt("0", 3):基数3是三进制,"0"合法,返回0
这就是结果中出现NaN的核心原因。
修复方法
你可以显式给parseInt指定十进制基数,同时避免map传递的索引被当作基数:
function parseIP(str) { const octets = str.split('.'); return octets.map(octet => parseInt(octet, 10)); }
或者更简单,用Number()函数转换——它不会接收额外参数,不会出现参数混淆问题:
function parseIP(str) { const octets = str.split('.'); return octets.map(Number); }
内容的提问来源于stack exchange,提问作者Harvey Pham
相关产品推荐
相关产品推荐

