1. 主页 > 大智慧

前端必会的String方法大全:字符串操作技巧与常见坑点解析

你造吗?新手写代码最常报的错是什么?TypeError!十次里有八次都是字符串操作惹的祸。上周还有个老弟问我:"为什么'2023-08-15'.split('-')能切成数组,但'Hello World'.split(' ')有时候会出幺蛾子?" 今天咱就把这些字符串操作的套路掰扯清楚,保准你看完再也不会被斜杠、空格和编码问题搞得头皮发麻!


一、基本操作三件套

??split、replace、indexOf??这三个方法必须刻进DNA里。举个栗子,处理用户输入的手机号:

javascript复制
let phone = "138-1234-5678";
// 拆分成数组记得去掉横杠
let cleanArr = phone.split('-'); // ["138","1234","5678"]
// 合并成纯数字
let pureNumber = cleanArr.join(''); // "13812345678"

这里有个坑:如果用户手抖多打了横杠,比如"138--1234",split会生成包含空字符串的数组。这时候就得用??filter??救场:

javascript复制
phone.split('-').filter(item => item !== '')

二、截取字符串的修罗场

slice、substring、substr这三个长得像三胞胎的方法,新手绝对分不清。记住这个表格:

方法参数含义支持负数参数
slice(开始索引, 结束索引)??
substring(开始索引, 结束索引)?
substr(开始索引, 截取长度)??

实战场景:截取身份证出生日期

javascript复制
let idCard = "110101199003077856";
// 19900307 生日字段
console.log(idCard.slice(6, 14));  // 19900307
console.log(idCard.substring(6,14)); // 同上
console.log(idCard.substr(6,8));   // 19900307 

但要是遇到负数索引,这三个就现原形了:

javascript复制
let str = "ABCDEF";
str.slice(2, -1)   // "CDE" 
str.substring(2,5) // "CDE"
str.substr(-3,2)   // "DE"

三、大小写转换的暗雷

toUpperCase和toLowerCase看着简单吧?但遇到土耳其语这类特殊语言就翻车。比如:

javascript复制
"?".toUpperCase()  // "?" (土耳其语)
"?".toLowerCase()  // "?" 

解决方法是用??localeCompare??:

javascript复制
str.toLocaleLowerCase('tr-TR') 

不过日常开发中,建议所有涉及国际化的项目都统一用??toLocaleUpperCase()??和??toLocaleLowerCase()??


四、正则表达式的好基友

search和match这俩方法离了正则就是战五渣。比如验证密码强度:

javascript复制
let password = "Abc123!@#";
// 必须包含大小写+数字+特殊符号
if(password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/)) {
    console.log("强密码");
}

但要注意:match返回的是数组或null,所以判断时得用:

javascript复制
if(password.match(/正则/) !== null)

五、隐藏BOSS:trim家族

trim、trimStart、trimEnd这三个方法能救命!处理用户输入时:

javascript复制
let input = "   hello@example.com   ";
// 传统写法
input.trim() // "hello@example.com"
// 现代写法
input.trimStart().trimEnd()

但遇到全角空格就歇菜了,这时候得上replace:

javascript复制
input.replace(/^[\s\u3000]+|[\s\u3000]+$/g, '')

六、小编踩坑实录

有次做URL参数解析,用split('&')分割参数,结果遇到带&符号的base64数据直接崩了。后来改用??URLSearchParams??对象才解决:

javascript复制
const params = new URLSearchParams('a=1&b=2&c=3')
params.get('b') // "2"

所以重点来了:??处理复杂字符串优先考虑专用API,别死磕字符串方法??

最后说个冷知识:用??repeat??方法生成占位符超方便:

javascript复制
console.log("0".repeat(10)) // "0000000000"

比写for循环优雅多了是不是?好了,赶紧打开控制台把这些方法都敲一遍,下次遇到字符串处理就能笑看同事抓耳挠腮啦!

本文由嘻道妙招独家原创,未经允许,严禁转载