Skip to content

JavaScript 字符串

JavaScript 字符串用于存储和处理文本数据。

JavaScript 字符串是由零个或多个字符组成的序列,例如 “Hello, World!” 或 ‘JavaScript is fun!’。

字符串可以使用单引号 ('...')、双引号 ("...") 或反引号(模板字面量:`...`)创建:

const carName1 = "Volvo XC60";
const carName2 = 'Volvo XC60';
const carName3 = `Volvo XC60`; // 模板字面量

只要内部引号与外部引号不匹配,就可以在字符串中使用引号。如果匹配,则必须使用转义字符:

const answer1 = "It's alright"; // 双引号内的单引号
const answer2 = 'He is called "Johnny"'; // 单引号内的双引号
const answer3 = "He is called \"Johnny\""; // 转义双引号
const answer4 = 'It\\'s alright'; // 转义单引号

字符串的 length 属性返回字符串中的字符数量(即其长度):

const txt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const len = txt.length; // len 将为 26

要在字符串中包含特殊字符,需要使用反斜杠 (\) 转义字符。

当你想包含与字符串定界符相同的引号字符,或包含不能直接输入或具有特殊含义的字符时,这很有必要。

常见的转义序列:

序列表示
’单引号 (’)
“双引号 (”)
\反斜杠 ()
\n换行
\r回车 (常与 \n 一起用于 CRLF 换行符)
\t制表符
\b退格符 (在现代 Web 环境中很少使用)
\f换页符 (在现代 Web 环境中很少使用)

示例:

const message = "This string contains a \"quoted text\" and a new line character.\nSee? This is on a new line.";
console.log(message);

ES6 引入了模板字面量,它提供了一种增强的字符串处理方式。它们使用反引号 (`) 括起来,而不是单引号或双引号。

模板字面量的主要特性:

  • 字符串插值: 可以使用 ${expression} 轻松地将表达式(变量、函数调用等)直接嵌入到字符串中。
  • 多行字符串: 字符串可以跨越多行,无需使用像 \n 这样的特殊转义字符。

插值示例:

const name = "Alice";
const age = 30;
const greeting = `Hello, my name is ${name} and I am ${age} years old.`;
// greeting 将是 "Hello, my name is Alice and I am 30 years old."

多行字符串示例:

const poem = `The quick brown fox
jumps over
the lazy dog.`;
console.log(poem);

在现代 JavaScript 中,这通常是创建多行字符串或包含嵌入变量的字符串的首选方式。

作为对象的字符串(避免使用)

Section titled “作为对象的字符串(避免使用)”

通常,JavaScript 字符串是原始值,由字面量创建(例如,const firstName = "John";)。

然而,字符串也可以使用 new String() 构造函数定义为对象(例如,const firstName = new String("John");)。

const x = "John"; // typeof x 是 "string" (原始值)
const y = new String("John"); // typeof y 是 "object" (对象)
console.log(x === y); // false (类型不同)
console.log(x == y); // true (值相同,宽松相等)
警告: 不要使用 new String() 将字符串创建为对象。这样做会显著降低执行速度,使比较复杂化,并导致意外行为。始终使用字符串字面量来创建字符串。

比较字符串对象很棘手:

const a = new String("John");
const b = new String("John");
console.log(a === b); // false (它们是内存中不同的对象)
console.log(a == b); // false (对象按引用而不是值进行比较)

尽管字符串字面量是原始值,但当您尝试访问它们的属性(如 length)或调用方法时,JavaScript 会临时将它们包装成一个 String 对象。这使得您可以流畅地将类似对象的特性与原始字符串一起使用。

属性描述
length返回字符串中的字符数量。

字符串方法返回一个新的字符串或其他值;它们不会修改原始字符串(字符串是不可变的)。

方法描述
charAt(index)返回指定索引处的字符。
charCodeAt(index)返回指定索引处字符的 Unicode 值。
concat(str1, str2, …, strN)连接一个或多个字符串,并返回一个新的组合字符串。
includes(searchValue, position?)检查字符串是否包含另一个字符串,返回 true 或 false。区分大小写。
startsWith(searchValue, position?)检查字符串是否以指定字符串的字符开头,返回 true 或 false。
endsWith(searchValue, length?)检查字符串是否以指定字符串的字符结尾,返回 true 或 false。
indexOf(searchValue, fromIndex?)返回指定值在字符串中首次出现的索引。如果未找到,返回 -1。
lastIndexOf(searchValue, fromIndex?)返回指定值在字符串中最后一次出现的索引。如果未找到,返回 -1。
match(regexp)搜索与正则表达式匹配的字符串,并将匹配项作为 Array 对象返回。
matchAll(regexp)返回与字符串匹配的正则表达式所有结果的迭代器,包括捕获组。
replace(searchValue, newValue)搜索字符串中的值(或正则表达式),并返回替换了部分或全部匹配项的新字符串。newValue 可以是字符串或函数。
replaceAll(searchValue, newValue)返回一个新字符串,其中所有 searchValue 的出现都被 newValue 替换。
search(regexp)在字符串中搜索值(正则表达式),并返回匹配项的位置。如果没有匹配项,返回 -1。
slice(startIndex, endIndex?)提取字符串的一部分并作为新字符串返回。不包括 endIndex。
split(separator?, limit?)根据指定的 separators 将字符串分割成子字符串数组。
substring(startIndex, endIndex?)提取字符串中两个指定索引之间的字符。如果 startIndex > endIndex,则它们会被交换。
toLowerCase()将字符串转换为小写字母。
toUpperCase()将字符串转换为大写字母。
trim()移除字符串两端的空白字符。
trimStart() (or trimLeft())移除字符串开头的空白字符。
trimEnd() (or trimRight())移除字符串末尾的空白字符。
padStart(targetLength, padString?)从字符串开头填充另一个字符串,使结果字符串达到指定长度。
padEnd(targetLength, padString?)从字符串末尾填充另一个字符串,使结果字符串达到指定长度。
toString()返回字符串本身(可用于将 String 对象转换回原始字符串)。
valueOf()返回 String 对象的原始值。

注意:substr(startIndex, length) 被认为是遗留特性。请改用 substring() 或 slice()。