String.prototype.at() 是 ES2022 新增方法,支持正负索引取字符,负数从末尾计数,越界返回 undefined,比 str[i] 和 charAt() 更安全直观;兼容性差时需降级处理。

String.prototype.at() 是 JavaScript 中用于获取字符串中指定位置字符的现代方法,它支持负数索引(从末尾开始计数),比传统的 str[index] 或 str.charAt() 更安全、更直观。
支持负数索引,无需手动计算长度
传统方式取最后一个字符需要写 str[str.length - 1],而 at(-1) 直接可读且不易出错:
-
"hello".at(0)→"h" -
"hello".at(-1)→"o"(等价于str[str.length - 1]) -
"hello".at(-5)→"h"(首字符) -
"hello".at(-10)→undefined(越界返回 undefined,不报错)
比方括号访问更健壮
方括号语法 str[i] 对负数索引返回 undefined,但语义不明确;charAt() 对负数始终返回空字符串 "",容易掩盖逻辑错误。而 at() 统一用 undefined 表示无效位置,行为一致且便于判断:
-
"a".at(-1)→"a" -
"a".at(1)→undefined -
"a"[-1]→undefined(但这是访问属性,非设计用途) -
"a".charAt(-1)→""(易被误认为“取到空字符”)
注意兼容性与替代方案
at() 是 ES2022 新增特性,较老环境(如 IE、Node.js < 16.6)不支持。若需兼容,可用以下安全降级:
立即学习“Java免费学习笔记(深入)”;
- 手动实现:
str => (i) => { const idx = i = 0 && idx - 使用 polyfill 库(如 core-js)
- 构建工具中开启自动 polyfill(如 Babel + preset-env)
适用于 Unicode 完整字符(含 emoji、组合符)
at() 基于 UTF-16 编码单元的逻辑位置,但对大多数常见 emoji 和基础 Unicode 字符能正确返回单个“用户感知字符”。不过严格处理复杂组合(如带变音符号的字符或 ZWJ 序列)仍需 Array.from(str)[i] 或 Intl.Segmenter。
-
"?".at(0)→"?"(正确) -
"??".at(0)→"?"(ZWJ 合成字符可能被拆分,此时建议用Array.from)










