String.prototype.charAt()
charAt()
是 String
值的一个方法,它返回一个新的字符串,该字符串包含在给定索引处的单个 UTF-16 代码单元。
charAt()
始终将字符串索引为 UTF-16 代码单元 序列,因此它可能会返回孤立的代理字符。要获取给定索引处的完整 Unicode 代码点,请使用 String.prototype.codePointAt()
和 String.fromCodePoint()
。
试一试
语法
charAt(index)
参数
返回值
表示指定 index
处字符(正好一个 UTF-16 代码单元)的字符串。如果 index
超出 0
– str.length - 1
的范围,则 charAt()
返回空字符串。
描述
字符串中的字符从左到右索引。第一个字符的索引为 0
,名为 str
的字符串中最后一个字符的索引为 str.length - 1
。
Unicode 代码点范围从 0
到 1114111
(0x10FFFF
)。charAt()
始终返回一个值小于 65536
的字符,因为较高的代码点由一对 16 位代理伪字符表示。因此,为了获取一个值大于 65535
的完整字符,有必要不仅检索 charAt(i)
,还要检索 charAt(i + 1)
(就像操作一个包含两个字符的字符串一样),或者使用 codePointAt(i)
和 String.fromCodePoint()
代替。有关 Unicode 的信息,请参阅 UTF-16 字符、Unicode 代码点和音节簇。
charAt()
与使用 方括号表示法 访问指定索引处的字符非常相似。主要区别在于
charAt()
尝试将index
转换为整数,而方括号表示法则不转换,并直接使用index
作为属性名称。- 如果
index
超出范围,则charAt()
返回空字符串,而方括号表示法返回undefined
。
示例
使用 charAt()
以下示例显示字符串 "Brave new world"
中不同位置的字符
const anyString = "Brave new world";
console.log(`The character at index 0 is '${anyString.charAt()}'`);
// No index was provided, used 0 as default
console.log(`The character at index 0 is '${anyString.charAt(0)}'`);
console.log(`The character at index 1 is '${anyString.charAt(1)}'`);
console.log(`The character at index 2 is '${anyString.charAt(2)}'`);
console.log(`The character at index 3 is '${anyString.charAt(3)}'`);
console.log(`The character at index 4 is '${anyString.charAt(4)}'`);
console.log(`The character at index 999 is '${anyString.charAt(999)}'`);
这些行显示以下内容
The character at index 0 is 'B' The character at index 0 is 'B' The character at index 1 is 'r' The character at index 2 is 'a' The character at index 3 is 'v' The character at index 4 is 'e' The character at index 999 is ''
charAt()
可能会返回孤立的代理字符,这些字符不是有效的 Unicode 字符。
const str = "𠮷𠮾";
console.log(str.charAt(0)); // "\ud842", which is not a valid Unicode character
console.log(str.charAt(1)); // "\udfb7", which is not a valid Unicode character
要获取给定索引处的完整 Unicode 代码点,请使用按 Unicode 代码点拆分索引的方法,例如 String.prototype.codePointAt()
和 将字符串扩展 为 Unicode 代码点数组。
const str = "𠮷𠮾";
console.log(String.fromCodePoint(str.codePointAt(0))); // "𠮷"
console.log([...str][0]); // "𠮷"
注意:避免使用 charAt()
重新实现上述解决方案。孤立代理字符的检测及其配对非常复杂,并且内置 API 可能会更高效,因为它们直接使用字符串的内部表示。如果必要,请为上面提到的 API 安装 polyfill。
规范
规范 |
---|
ECMAScript 语言规范 # sec-string.prototype.charat |
浏览器兼容性
BCD 表格仅在浏览器中加载