字符串和正则✅
JavaScript 字符串是如何存储的?
答案
- JavaScript 字符串采用 UTF-16 编码,每个字符占用 2 字节(16 位),支持 BMP(基本多文种平面)和部分辅助平面字符。
- 字符串是不可变类型,任何修改操作都会生成新字符串,原字符串内容不会被改变。
- 内部存储为类数组结构,按索引访问字符(
str[index]),但高位 Unicode 字符(如 emoji)会占用两个索引。 - 字符串长度(
length)按 UTF-16 单元计数,非实际字符数,部分字符可能导致长度与视觉不一致。 - 字符串底层实现依赖 JS 引擎,通常为连续内存块,便于高效读取和拼接。
示例说明:
Tests
提示
在 ES5 之后统一使用 UTF-16 编码,早期使用 UCS-2 编码。引擎内部在字符串存储存在优化,会采用变长策略存储,节省内存。细节可以阅读 V8 字符串探索和优化 进一步理解
延伸阅读:
- MDN: String — JS 字符串基础与编码说明
- ECMA-262: String 类型 — 规范定义与底层原理
- Unicode 与 UTF-16 — Unicode 官方 FAQ,解释 UTF-16 编码细节
- javascript 编码 说明 js UCS-2 与 UTF-16 的区别
JavaScript 支持哪些正则能力?
答案
核心概念
- 标志位:
i/g/m/s/u/y控制匹配行为(大小写、全局、多行、dotAll、Unicode、黏连) - 常用元字符与字符类:
. \d \w \s以及自定义[ ]、排除[^ ] - 边界:
^ $ \b,多行模式下行首行尾 - 分组与捕获:
()、命名捕获(?<name>pattern)、反向引用\1与$<name> - 断言:前瞻
(?=…) / (?!…),后顾(?<=…)/(?!<…)
- flags
Tests
说一下 JS RegExp 与 String 的常用方法及差异
答案
核心要点
- RegExp
- test(str): 测试字符串是否匹配正则表达式,返回布尔值。
- exec: 执行匹配,返回匹配结果数组或 null。
- String
- match: 返回匹配结果数组或 null。
- matchAll: 返回所有匹配结果的迭代器。
- replace: 替换匹配的子串,返回新字符串。支持分组回填
$1、命名捕获$<name> - replaceAll: 替换所有匹配的子串,返回新字符串。
- split: 按照匹配的子串分割字符串,返回数组。
- g 标志影响 match/matchAll 返回值与 exec 的 lastIndex
- methods
Tests
分组/命名捕获/反向引用怎么用?
答案
核心要点
分组 ()用于提取或重复匹配子表达式,可通过下标访问捕获内容。命名捕获 (?<name>pattern)让分组更语义化,结果通过 groups.name 访问。- 反向引用
\1、\2 或 $<name>用于匹配前面分组内容,实现去重、格式校验、替换重排等。
- groups
Tests
边界/多行/单词边界如何工作?
答案
核心要点
^/$在默认模式匹配整个字符串的首尾;m 模式作用于每行\b用于单词边界匹配(字母数字与非字母数字之间)
- boundaries
Tests
前瞻/后顾断言的应用场景?
答案
核心要点
- 不消费字符的条件匹配:
(?=…)/(?!…)与(?<=…)/(?<!…) - 常用于前后缀定位、金额提取、复杂条件过滤
- lookaround
Tests
数字千分位
答案
核心要点
- 使用零宽断言模式:
\B(?=(\d{3})+(?!\d))对整数部分分组 - 注意负号与小数部分保留
- impl
Tests
url 查询字段解码
答案
核心要点
- 解析
?之后的查询串,支持重复 key → 数组 - 对
+视为空格,配合 decodeURIComponent 解码
- impl
Tests