JavaScript判断字符串首字符是否为数字及去除地址数字前缀
嘿,这个地址处理的需求我太熟了!你提到用isNaN不够可靠,确实是这样——这个函数的判断逻辑有时候会坑人,比如它会把空格、制表符这类能转成数字0的字符当成“非NaN”,导致误判。下面给你几个更靠谱的实现方案:
方案1:正则表达式(最简洁高效)
正则可以一步搞定“判断首字符是否为数字”+“去除数字部分”的需求,还能处理地址开头可能存在的空格:
const address = "12345 White House Lane"; // 先判断地址开头(允许前导空格)是否有数字 if (/^\s*\d/.test(address)) { // 替换掉开头的所有数字及后续的空格,得到纯街道名 const streetName = address.replace(/^\s*\d+\s*/, ''); console.log(streetName); // 输出:White House Lane }
/^\s*\d/:匹配开头的任意空格(\s*)+ 一个数字(\d),用来判断是否需要处理/^\s*\d+\s*/:匹配开头的任意空格+所有连续数字+后续的任意空格,替换成空字符串就得到了干净的街道名
方案2:字符编码判断(更底层,精准控制)
数字0-9的Unicode编码范围是48到57,我们可以通过字符的编码值来精准判断:
const address = "12345 White House Lane"; const trimmedAddr = address.trim(); // 先去掉前后的空格,避免开头是空格的干扰 if (trimmedAddr) { // 先确保地址不为空 const firstCharCode = trimmedAddr.charCodeAt(0); // 判断是否在数字的编码范围内 if (firstCharCode >= 48 && firstCharCode <= 57) { // 去除数字部分,这里同样可以用正则或者split const streetName = trimmedAddr.split(/\s+/).slice(1).join(' '); console.log(streetName); // 输出:White House Lane } }
这个方法完全不会受非数字但能转成数字的字符干扰,判断逻辑非常清晰。
为什么
isNaN不靠谱? 举几个例子你就懂了:
isNaN(' ')返回false,因为空格会被转成数字0isNaN('\t')返回false,制表符同样会被转成0isNaN('')返回false,空字符串转成数字也是0
如果你的地址开头有这些空白字符,用isNaN就会错误地认为首字符是数字,导致不必要的处理。
内容的提问来源于stack exchange,提问作者William Merritt
相关产品推荐
相关产品推荐

