JavaScript 中没有 charPointAt 方法,正确方法是 codePointAt() 和 charCodeAt();前者返回完整 Unicode 码点,正确处理 emoji 和增补字符,后者仅返回 UTF-16 编码单元,遇代理对易出错。

JavaScript 中没有 charPointAt 方法,你可能指的是 charCodeAt() 或较新的 codePointAt() —— 这两个方法都用于获取字符串中字符的编码值,但处理 Unicode 的方式有本质区别,尤其涉及 emoji、中文、生僻字或增补平面(Supplementary Planes)字符时。
codePointAt():正确处理 Unicode 全字符集
codePointAt(index) 返回指定位置字符的 Unicode 码点(Code Point),能正确识别大于 0xFFFF 的字符(如大多数 emoji 和部分汉字),返回一个完整的 21 位整数。
- 对基本多文种平面(BMP)字符(如英文字母、常用汉字),结果与
charCodeAt()相同 - 对增补字符(如 ?、??、?),它会把整个代理对(surrogate pair)合并计算,返回真实码点(例如
"?".codePointAt(0)→127757) - 若索引超出范围,返回
undefined
charCodeAt():仅返回 UTF-16 编码单元,易出错
charCodeAt(index) 返回位置处的 UTF-16 编码单元(16 位整数),不理解代理对。遇到增补字符时,它只返回高代理项(high surrogate)或低代理项(low surrogate)中的一个,无法还原原字符。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
"??".charCodeAt(0)→55357(高代理项,不是真实码点) -
"??".charCodeAt(1)→56398(低代理项,单独无意义) - 直接用这两个值拼接或比较,会导致逻辑错误或乱码
实际使用建议
除非明确处理底层 UTF-16 数据,否则应优先使用 codePointAt() 和配套的 String.fromCodePoint():
立即学习“Java免费学习笔记(深入)”;
- 遍历字符串所有字符(含 emoji):用
for...of循环(自动按码点迭代),而非for(let i=0; i<s.length; i++) - 需要索引访问时:用
codePointAt(i),并配合String.prototype.codePointCount(ES2024 新增)或手动跳过代理对 - 替换/过滤特殊字符:先用
codePointAt()判断码点范围(如0x1F600–0x1F64F是表情符号区间),再操作 - 兼容旧环境?可用 polyfill:
Array.from(str).map(ch => ch.codePointAt(0))(但注意性能)
小结:关键区别一句话
charCodeAt() 拆开看“UTF-16 单元”,codePointAt() 还原出“人类认知的字符”——处理现代 Web 字符串,后者才是语义正确的选择。

















