String.prototype.charAt()

charAt()String 值的一个方法,它返回一个新的字符串,该字符串包含在给定索引处的单个 UTF-16 代码单元。

charAt() 始终将字符串索引为 UTF-16 代码单元 序列,因此它可能会返回孤立的代理字符。要获取给定索引处的完整 Unicode 代码点,请使用 String.prototype.codePointAt()String.fromCodePoint()

试一试

语法

js
charAt(index)

参数

index

要返回的字符的基于零的索引。 转换为整数undefined 转换为 0。

返回值

表示指定 index 处字符(正好一个 UTF-16 代码单元)的字符串。如果 index 超出 0str.length - 1 的范围,则 charAt() 返回空字符串。

描述

字符串中的字符从左到右索引。第一个字符的索引为 0,名为 str 的字符串中最后一个字符的索引为 str.length - 1

Unicode 代码点范围从 01114111 (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" 中不同位置的字符

js
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 字符。

js
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 代码点数组。

js
const str = "𠮷𠮾";
console.log(String.fromCodePoint(str.codePointAt(0))); // "𠮷"
console.log([...str][0]); // "𠮷"

注意:避免使用 charAt() 重新实现上述解决方案。孤立代理字符的检测及其配对非常复杂,并且内置 API 可能会更高效,因为它们直接使用字符串的内部表示。如果必要,请为上面提到的 API 安装 polyfill。

规范

规范
ECMAScript 语言规范
# sec-string.prototype.charat

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅