苟日新,日日新,又日新
| 场景 | 代码 | 说明 |
|---|---|---|
| 清理用户输入 | const input = ' hello '.trim(); // "hello" |
移除字符串首尾的所有空白字符 |
| 仅移除开头 | str.trimStart() 或 str.trimLeft() |
ES2019 新增,移除开头空白 |
| 仅移除结尾 | str.trimEnd() 或 str.trimRight() |
ES2019 新增,移除结尾空白 |
| 注意问题 | 说明 |
|---|---|
| 不会修改原字符串 | trim() 返回新字符串,原字符串不变 |
| 空白字符范围 | 包括空格、Tab、换行、回车及其他 Unicode 空白字符 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 判断包含 | "hello".includes("ell") // true" |
ES2015 新增,返回布尔值 |
| 查找位置 | "hello".indexOf("e") // 0" |
返回第一次出现的索引 |
| 指定位置查找 | str.includes("o", 3) |
从指定索引开始查找 |
| 模糊判断 | str.indexOf("xyz") === -1 |
未找到返回 -1 |
| 注意问题 | 说明 |
|---|---|
| includes 不支持正则 | 只能传字符串,不支持正则表达式 |
| indexOf 性能更好 | 简单场景 indexOf 通常更快 |
| 大小写敏感 | 两者都区分大小写 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 判断开头 | "hello".startsWith("he") // true" |
ES2015 新增 |
| 判断结尾 | "hello".endsWith("lo") // true" |
ES2015 新增 |
| 指定长度匹配 | str.startsWith("he", 0) |
可以指定开始位置 |
| 注意问题 | 说明 |
|---|---|
| 精确匹配 | 必须完全匹配指定字符串 |
| 大小写敏感 | 区分大小写 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 单次替换 | "hello world".replace("l", "L") // "heLlo worLd" |
只替换第一个匹配 |
| 全局替换 | str.replace(/l/g, "L") // "heLLo woLLd" |
使用正则 + 全局标志 |
| 全部替换 | "aaa".replaceAll("a", "b") // "bbb" |
ES2021 新增 |
| 函数替换 | str.replace(/(\w+)/g, "$1X") |
支持回调函数 |
| 注意问题 | 说明 |
|---|---|
| replaceAll 需要正则 | 必须用全局正则或字符串 |
| replace 不区分正则 | 字符串作为第一个参数时不会转正则 |
| 不修改原字符串 | 返回新字符串 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 按字符拆分 | "hello".split("") // ["h","e","l","l","o"]" |
分割为字符数组 |
| 按分隔符拆分 | "a,b,c".split(",") // ["a","b","c"]" |
按指定分隔符 |
| 按正则拆分 | str.split(/[.,]/) |
按正则表达式分割 |
| 限制数量 | "a,b,c".split(",", 2) // ["a","b"]" |
限制返回数组长度 |
| 注意问题 | 说明 |
|---|---|
| 空字符串处理 | 分隔符为空时,每个字符单独为数组元素 |
| 返回数组 | 总是返回数组,不是字符串 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 匹配正则 | "hello".match(/l/) // ["l", index: 2] |
返回匹配详情 |
| 全局匹配 | "hello".match(/l/g) // ["l", "l"] |
返回所有匹配 |
| 查找位置 | "hello".search(/e/) // 1 |
返回第一次匹配位置 |
| 正则对象 | const re = /h/; str.match(re) |
支持 RegExp 对象 |
| 注意问题 | 说明 |
|---|---|
| match 需要正则 | 只能传正则表达式 |
| search 返回索引 | 返回数字索引或 -1 |
| 大小写敏感 | 默认区分大小写 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 转小写 | "HELLO".toLowerCase() // "hello" |
标准方法 |
| 转大写 | "hello".toUpperCase() // "HELLO" |
标准方法 |
| 地区特定小写 | "Türkiye".toLocaleLowerCase("tr") // "türkiye" |
遵循地区规则 |
| 地区特定大写 | str.toLocaleUpperCase("zh") |
遵循地区规则 |
| 注意问题 | 说明 |
|---|---|
| 土耳其语问题 | 土耳其语中 I 转大写是 İ 不是 I |
| 地区特定方法优先 | 不确定语言时用 toLocale 系列 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 补零格式化 | 1.toString().padStart(2, "0") // "01" |
数字转两位 |
| 时间格式化 | min.padStart(2, "0") |
分钟补零 |
| 填充开头 | "abc".padStart(5, "-") // "--abc" |
自定义填充字符 |
| 填充结尾 | "abc".padEnd(5, "-") // "abc--" |
结尾填充 |
| 注意问题 | 说明 |
|---|---|
| 长度不够返回原串 | 目标长度小于等于原长度时不变 |
| 可重复填充 | 填充字符串会重复使用 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 字符串拼接 | str1.concat(str2) // "ab" |
拼接两个字符串 |
| 多串拼接 | a.concat(b, c, d) |
可接多个参数 |
| 混合类型 | a.concat(123) // "123" |
非字符串会自动转换 |
| 注意问题 | 说明 |
|---|---|
| 模板字符串优先 | 现代开发更推荐 ${a}${b} |
| 返回新串 | 不修改原字符串 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 截取子串 | "hello".substring(1, 4) // "ell" |
不包含结束索引 |
| 负数处理 | str.substring(-1) // 当作 0 |
负数视为 0 |
| 类似数组 | "hello".slice(1, 4) // "ell" |
负数表示倒数位置 |
| 简单截取 | str.slice(0, 3) // "hel" |
slice 更灵活 |
| 注意问题 | 说明 |
|---|---|
| substring 不支持负数 | 负数会被当作 0 |
| slice 支持负数 | slice 更推荐用于截取 |
| 不包含结束位 | 都不包含结束索引 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 正向索引 | "hello".at(0) // "h" |
ES2022 新增 |
| 负向索引 | "hello".at(-1) // "o" |
支持负索引取倒数 |
| 数组替代 | str.at(-n) |
类似数组访问 |
| 注意问题 | 说明 |
|---|---|
| 索引越界返回 undefined | 不抛出错误 |
| 较新版本 | 需较新浏览器支持 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 获取编码 | "A".charCodeAt(0) // 65" |
返回 Unicode 编码 |
| 获取高位代理 | "😊".charCodeAt(0) // 55357" |
代理对高位部分 |
| 完整编码 | "😊".codePointAt(0) // 128522" |
支持完整 Unicode |
| 反向转换 | String.fromCharCode(65) // "A" |
编码转字符 |
| 注意问题 | 说明 |
|---|---|
| charCode 只处理 BMP | 代理对需要两个调用 |
| codePointAt 更可靠 | 处理 emoji 等完整字符 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 统一字符 | "é".normalize("NFC") |
组合字符标准化 |
| 分解字符 | "é".normalize("NFD") |
分解组合字符 |
| 大小写敏感 | "É".normalize("NFKC") |
兼容组合转换 |
| 注意问题 | 说明 |
|---|---|
| 四种模式 | NFC/NFD/NFKC/NFKD |
| 默认 NFC | 不传参数默认 NFC |
| 场景 | 代码 | 说明 |
|---|---|---|
| 检查有效性 | str.isWellFormed() |
ES2024 新增,检查代理对 |
| 转为有效 | str.toWellFormed() |
替换无效代理为替换字符 |
| 注意问题 | 说明 |
|---|---|
| 较新特性 | 需较新浏览器支持 |
| 代理对处理 | 专门处理 Unicode 代理对 |
| 场景 | 代码 | 说明 |
|---|---|---|
| 重复字符 | "*".repeat(5) // "*****" |
重复字符串 |
| 填充线 | "=".repeat(20) |
创建分隔线 |
| 表格线 | "─".repeat(50) |
表格边界 |
| 注意问题 | 说明 |
|---|---|
| 次数必须非负 | 负数返回空串 |
| 0 次返回空串 | repeat(0) 返回 “” |
| 场景 | 代码 | 说明 |
|---|---|---|
| 字典排序 | "apple".localeCompare("banana") // -1" |
返回排序结果 |
| 地区特定 | str.localeCompare("中", "zh-CN") |
按地区规则排序 |
| 数组排序 | arr.sort((a,b)=>a.localeCompare(b)) |
字符串数组排序 |
| 注意问题 | 说明 |
|---|---|
| 返回数字 | -1/0/1 表示小于/等于/大于 |
| 地区影响 | 不同地区排序规则不同 |