charCodeAt() 返回指定位置字符的 UTF-16 编码单元值(0–65535),对增补字符仅返回代理项之一,无法还原完整码点;应使用 codePointAt() 获取完整 Unicode 码点(0–1114111),且索引越界时返回 NaN。

charCodeAt() 返回的是指定位置字符的 Unicode 编码值(UTF-16 编码单元),范围是 0 到 65535(即 0x0000 到 0xFFFF)。
只返回一个 UTF-16 编码单元
JavaScript 字符串内部使用 UTF-16 编码。对于基本多文种平面(BMP)内的字符(U+0000–U+FFFF),每个字符正好对应一个 16 位编码单元,charCodeAt() 直接返回其码点值,例如:
-
'A'.charCodeAt(0)→ 65 -
'中'.charCodeAt(0)→ 20013 -
'\u{1F600}'.charCodeAt(0)(?,U+1F600)→ 55356(高代理项,不是完整码点)
遇到增补字符(U+10000 及以上)会拆分为代理对
Unicode 中 U+10000 到 U+10FFFF 的字符(如大部分 emoji、古文字)在 UTF-16 中用两个连续的 16 位编码单元表示(高代理项 + 低代理项)。charCodeAt() 每次只取一个位置的编码单元,因此:
- 对位置 0 调用 → 返回高代理项(0xD800–0xDFFF 区间,即 55296–57343)
- 对位置 1 调用 → 返回低代理项(0xDC00–0xDFFF 区间,即 56320–57343)
- 单独看任一返回值都无法还原原始字符,必须成对解析
安全获取完整 Unicode 码点用 codePointAt()
若需正确处理所有 Unicode 字符(包括增补平面),应使用 String.prototype.codePointAt():
立即学习“Java免费学习笔记(深入)”;
-
'?'.codePointAt(0)→ 128512(即 0x1F600) - 它能自动识别代理对并返回完整的 21 位码点
- 返回值范围是 0 到 0x10FFFF(0–1114111)
注意边界和无效索引
当索引超出字符串长度或为负数时,charCodeAt() 返回 NaN,而非抛错:
-
'a'.charCodeAt(1)→ NaN -
'a'.charCodeAt(-1)→ NaN - 建议先校验索引有效性:
index >= 0 && index


















