ES6及后续版本为JavaScript字符串引入模板字面量、includes/startsWith/endsWith、repeat、codePointAt/fromCodePoint/normalize及for...of遍历等新特性,全面提升Unicode正确性、模板化、模式匹配与不可变操作能力。

ES6(ECMAScript 2015)及后续版本为 JavaScript 字符串引入了多个实用的新方法和增强特性,显著提升了字符串处理的可读性、安全性和表达能力。这些新增不是简单补丁,而是围绕 Unicode 正确性、模板化、模式匹配和不可变操作等核心理念设计的。
模板字面量(Template Literals)——告别拼接,支持多行与嵌入
这是 ES6 最广为人知的字符串新特性,用反引号 ` 定义,支持变量插值、多行文本和标签函数。
- 变量插值:用
${expression}直接嵌入任意表达式,无需+拼接 - 多行支持:换行符会原样保留在字符串中,无需
\n或连接符 - 标签函数:可自定义解析逻辑,如转义 HTML、国际化、SQL 参数化等(例如
html`<div>${name}</div>`)
String.prototype.includes()、startsWith()、endsWith() —— 更语义化的子串判断
替代老旧的 indexOf !== -1 写法,返回布尔值,语义清晰、不易出错。
-
str.includes('foo'):判断是否包含子串(支持可选起始位置) -
str.startsWith('Hello'):判断是否以指定字符串开头(支持可选起始索引) -
str.endsWith('!'):判断是否以指定字符串结尾(支持可选长度参数,用于检查前 N 个字符)
String.prototype.repeat() —— 简洁生成重复字符串
替代 new Array(n + 1).join(str) 这类“黑魔法”写法,直接、可读、安全。
立即学习“Java免费学习笔记(深入)”;
-
'a'.repeat(3)→'aaa' - 参数必须为非负整数,否则抛出
RangeError(如repeat(-1)或repeat(1.5)) - 空字符串重复任意次仍为空字符串:
'' .repeat(100)→''
Unicode 意识增强:codePointAt()、fromCodePoint()、normalize()
ES6 明确支持 UTF-16 代理对(surrogate pairs),解决 emoji 和部分中文生僻字等四字节字符的正确处理问题。
-
str.codePointAt(i):返回位置i的 Unicode 码点(可正确处理 emoji,如'?'.codePointAt(0)→128522) -
String.fromCodePoint(128522):由码点生成字符(支持 > 0xFFFF 的字符,String.fromCharCode()不支持) -
str.normalize():标准化 Unicode 形式(如 NFC/NFD),解决等价字符比较问题(如带重音符号的字母可能有多种编码方式)
更安全的字符串遍历:for...of 循环 + 遍历器接口
字符串在 ES6 中默认实现了 [Symbol.iterator],可被 for...of 正确按 Unicode 字符(而非 UTF-16 码元)遍历。
-
for (const ch of '??') { console.log(ch); }输出 1 次(完整 emoji),而非 2 次(代理对拆分) - 配合扩展运算符使用:
[...'?abc']→['?', 'a', 'b', 'c'] - 避免使用传统
for (let i = 0; i 遍历含 emoji 或生僻字的字符串,易出错


















