String.prototype.at() 是 ES2022 引入的安全访问字符串字符的方法,支持负索引、统一返回字符或 undefined,简化倒序遍历与末位条件检索,现代浏览器及 Node.js 16.6+ 已原生支持。

String.prototype.at() 是 ES2022 引入的实用方法,专为安全、简洁地访问字符串中任意位置的字符而设计。它天然支持负索引(如 -1 表示最后一个字符),彻底规避了传统 str[str.length - 1] 或 str.slice(-1) 的冗余写法,尤其在倒序遍历与条件检索场景中显著简化逻辑。
用 at() 替代手动计算索引实现安全倒序访问
传统方式需反复计算长度并处理边界(如空字符串或越界),容易出错:
-
str[str.length - 1]:空字符串时返回undefined,但访问str[-1]直接是undefined(非报错,但语义模糊) -
str.slice(-1):返回字符串而非单个字符,且对空串返回空串,类型不一致
at() 统一返回字符(或 undefined),负索引语义清晰:
-
"hello".at(-1)→"o" -
"a".at(-5)→undefined(安全,不抛错) -
"".at(-1)→undefined
简化倒序循环:省去 length 计算与边界判断
传统倒序 for 循环常写成:
for (let i = str.length - 1; i >= 0; i--) { ... }
使用 at() 可配合 while 或 for-of 风格更直观地“从后往前读”:
- 按位置倒序遍历(索引递减):
for (let i = -1; i >= -str.length; i--) { const char = str.at(i); /* 处理 char */ } - 配合
break快速退出:let i = -1;<br>while ((char = str.at(i)) !== undefined) {<br> if (char === 'x') break;<br> i--;<br>}
替代正则 + split/reverse/join 实现高效末位条件检索
例如“找最后一个数字字符”或“跳过末尾空格后取最后一个非空字符”,过去可能这样写:
-
str.trimEnd().split('').reverse()[0](低效,创建中间数组) -
str.match(/\S(?=\s*$)/)?.[0](正则复杂,不易维护)
用 at() 配合简单循环更直接:
- 获取最后一个非空格字符:
let i = -1;<br>while (str.at(i) === ' ') i--;<br>const lastNonSpace = str.at(i);
- 查找最后一个数字:
for (let i = -1; i >= -str.length; i--) {<br> if (/\d/.test(str.at(i))) return str.at(i);<br>}
注意兼容性与降级方案
at() 在 Node.js 16.6+ 和现代浏览器(Chrome 92+, Firefox 95+, Safari 15.4+)中可用。若需兼容旧环境:
- 可轻量 polyfill:
if (!String.prototype.at) {<br> String.prototype.at = function(n) {<br> const idx = n >= 0 ? n : this.length + n;<br> return idx >= 0 && idx };<br>} - 或用
?.[n](可选链)+ 手动负索引转换作为临时替代(但不如at()语义明确)










