非法索引指超出字符串合法索引范围(0 到 length−1)的值,包括负数、≥length 的数及无法转为有效整数的类型;charAt() 对其统一转为数字再截断,最终不在 [0, length) 区间时返回空字符串 ""。

charAt() 遇到非法索引时,不会报错,而是返回空字符串("")。
什么是“非法索引”
JavaScript 字符串的索引从 0 开始,合法范围是 0 到 str.length - 1。超出这个范围的数值(如负数、大于等于 length 的数、非数字值)都属于非法索引。
- str.charAt(-1) → ""
- str.charAt(5)(当 str.length ≤ 5 时)→ ""
- str.charAt("abc") 或 str.charAt(null) → 先转为数字,再取索引;"abc" 转成 NaN,NaN 被当作 0 处理?不对 —— 实际上,任何不能转为有效整数的值都会被转为 0,但若结果不是有限整数(如 NaN、Infinity),则最终索引视为 0? 等等,这里要纠正:根据规范,
charAt内部调用ToInteger抽象操作,ToInteger(NaN)结果是 0,ToInteger(Infinity)是 0,ToInteger("2.7")是 2,ToInteger("abc")是 0。所以 str.charAt("abc") 实际等价于 str.charAt(0),除非字符串为空。
实际行为:统一转为数字再截断
charAt 会先把参数用 ToInt32(或等效逻辑)转换成 32 位整数,再判断是否落在 [0, length) 区间内:
- 非数字类型(如 undefined、null、true、[])→ 先 ToNumber,再 ToInt32
- NaN、Infinity、-Infinity → ToInt32 结果都是 0
- 小数(如 2.9)→ 向零截断为 2
- 超出 32 位有符号整数范围的数 → 按模 2³² 处理(但对字符串索引来说,几乎总会超出 length,结果仍是 "")
和 bracket notation 的区别
对比 str[0] 和 str.charAt(0):
立即学习“Java免费学习笔记(深入)”;
-
str[非法索引]直接返回undefined(不是空字符串) -
str.charAt(非法索引)总是返回""(字符串类型) - 例如:
"a"[1]→undefined;"a".charAt(1)→""
使用建议
不要依赖 charAt 的静默失败来判断索引合法性:
- 需要明确校验时,先用
index >= 0 && index - 想安全取字符,可封装:
function safeCharAt(str, i) { return i >= 0 && i - 注意:空字符串
""的"".charAt(0)也是"",不能单靠返回值真假判断是否存在字符


















