javascript中获取字符串指定位置字符推荐使用at(),因其支持负数索引(如str.at(-1)取末字符)、越界返回undefined更安全;charat()仅支持非负索引且越界返回空字符串,两者均按utf-16操作,处理emoji不完整,unicode安全应使用array.from(str)[index]。

JavaScript中获取字符串指定位置的字符,常用方法有 charAt() 和 at()。两者都能按索引取字符,但行为差异明显,尤其在处理负数索引和边界情况时。
charAt():传统方法,只支持非负索引
charAt(index) 是长期存在的标准方法。它接收一个数字参数,返回该索引处的字符(UTF-16 单元),若索引超出范围(小于 0 或 ≥ 字符串长度),则返回空字符串 ""。
- 索引自动转为整数,小数会被截断(如
"abc".charAt(1.7)等价于charAt(1)) - 不支持负数索引:
"hello".charAt(-1)返回"",而非最后一个字符 - 对代理对(如 emoji)可能返回不完整的码元,例如
"??".charAt(0)只返回第一个代理单元,显示为
at():ES2022 新增,支持负数索引与更直观语义
at(index) 是较新的提案(已进入 ES2022 标准),语法更贴近数组的 at() 方法,语义更自然。
- 支持负数索引:
"hello".at(-1)返回"o",at(-2)返回"l",类似 Python 的切片逻辑 - 越界时返回
undefined(不是空字符串),更利于类型判断和可选链操作 - 同样基于 UTF-16,对代理对的处理与
charAt()一致,仍可能截断 emoji;如需完整字符,应配合Array.from(str)或正则
实际使用建议
新项目推荐优先使用 at(),尤其当需要从末尾取字符(如获取文件扩展名、路径最后一段)时,代码更简洁安全。
- 替代
str.charAt(str.length - 1)→ 直接写str.at(-1) - 配合可选链:
str.at(-1)?.toUpperCase()不会报错,而str.charAt(-1).toUpperCase()会因空字符串调用方法而报错 - 注意兼容性:
at()在 Node.js 16.6+、Chrome 92+、Firefox 95+、Safari 15.4+ 支持;旧环境需 polyfill 或回退到charAt()加手动计算索引
补充:真正安全获取 Unicode 字符的方法
若需正确处理 emoji、中文、组合字符等,charAt() 和 at() 都不够——它们都按 UTF-16 码元操作。此时应先将字符串转为字符数组:
-
Array.from(str)[index]—— 最简单可靠的 Unicode 安全方式 -
[...str][index]—— 等效,但创建新数组开销略大 -
str.codePointAt(index)+String.fromCodePoint()—— 手动处理高码位,适合底层逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











