String.prototype.at() 提供更安全的字符访问方式,支持 Unicode 和负数索引,避免代理对问题,返回 undefined 而非截断字符,提升可读性与兼容性。

String.prototype.at() 提供了一种更直观、更安全的方式来访问字符串中的单个字符,尤其在处理 Unicode 字符(如 emoji 或带变音符号的字母)时,比中括号语法 [] 更可靠。
避免中括号语法的陷阱
中括号语法(如 str[0])直接按 UTF-16 编码单元索引,对大多数 ASCII 字符没问题,但遇到代理对(surrogate pairs)会出错。例如:
✅ 正确获取首字符(含 emoji):
const str = "??café";<br>console.log(str.at(0)); // "?"<br>console.log(str.at(-1)); // "é"
❌ 中括号可能截断 emoji 或返回 undefined:
console.log(str[0]); // "\ud83d"(不完整的高代理项)<br>console.log(str[1]); // "\udc4b"(不完整的低代理项)<br>console.log(str[2]); // "?"(看似正常,但索引逻辑已错乱)
支持负数索引,语义更清晰
.at() 原生支持负数索引,从末尾开始计数,无需手动计算 length:
-
str.at(-1)→ 最后一个字符(不是str[str.length - 1]) -
str.at(-2)→ 倒数第二个字符 - 超出范围时返回
undefined,不会静默返回undefined或空字符串(与中括号行为一致,但意图更明确)
提升代码可读性与维护性
用 .at() 替代 [] 后,意图一目了然:
-
email.at(0) === "@"比email[0] === "@"更强调“取第 0 个字符”这一操作语义 -
name.at(-1) === "!"比name[name.length - 1] === "!"简洁且不易出错 - 配合解构或链式调用时更自然:
str.split("").map(c => c.at(0))(虽此处无意义,但体现风格一致性)
兼容性与使用建议
目前主流浏览器(Chrome 92+、Firefox 95+、Safari 15.4+)及 Node.js 16.6+ 均已支持。若需兼容旧环境,可用简易 polyfill:
if (!String.prototype.at) {<br> String.prototype.at = function(idx) {<br> const n = idx < 0 ? this.length + idx : idx;<br> return this[n] ?? undefined;<br> };<br>}日常开发中,只要目标环境满足,应优先使用 .at() 替代中括号访问单字符——它更准确、更易读、更少隐式假设。

















