Skip to content

TypeScript - 字符串

字符串表示字符序列,是 TypeScript 和 JavaScript 中最基本的数据类型之一。它们用于存储文本数据。

TypeScript 使用 string 类型注解来标记存储字符串值的变量。

可以使用单引号 (')、双引号 (") 或反引号 (`) 来创建字符串。

let singleQuote: string = 'Hello';
let doubleQuote: string = "World";
let greeting: string = singleQuote + ' ' + doubleQuote; // Concatenation
console.log(greeting); // Output: Hello World

模板字面量(用反引号 (`) 包围)是处理字符串的现代且首选方式,尤其适用于嵌入表达式或创建多行字符串。

  • 嵌入表达式: 使用 ${expression} 语法,直接在字符串中嵌入变量或任何有效的 JavaScript 表达式。
  • 多行字符串: 模板字面量会保留反引号内的换行符。
let userName: string = "Alice";
let userAge: number = 30;
// Using embedded expressions
let message: string = `Welcome, ${userName}! You are ${userAge} years old.`;
console.log(message);
// Output: Welcome, Alice! You are 30 years old.
// Multi-line string
let poem: string = `Roses are red,
Violets are blue,
TypeScript is fun,
And so are you!`;
console.log("\nPoem:\n" + poem);

TypeScript 中的字符串(继承自 JavaScript)拥有内置的属性和方法用于操作:

属性/方法描述示例
length返回字符串中的字符数量。'hello'.length 的结果是 5
charAt(index)返回指定(从零开始)索引处的字符。'abc'.charAt(1) 的结果是 'b'
charCodeAt(index)返回指定索引处字符的 Unicode 值(数字)。'abc'.charCodeAt(1) 的结果是 98 (‘b’ 的 Unicode 值)
concat(str1, str2, ...)连接两个或多个字符串。'Hello'.concat(' ', 'World') 的结果是 'Hello World' (与 + 运算符效果相同)
indexOf(searchValue, fromIndex?)返回 searchValue 第一次出现的索引,如果未找到则返回 -1。可选参数 fromIndex 指定开始搜索的位置。'hello world'.indexOf('o') 的结果是 4
lastIndexOf(searchValue, fromIndex?)返回 searchValue 最后一次出现的索引,如果未找到则返回 -1。'hello world'.lastIndexOf('o') 的结果是 7
slice(startIndex, endIndex?)提取字符串的一部分并作为一个新字符串返回。endIndex 是可选的,且不包含该索引处的字符。'abcdef'.slice(1, 4) 的结果是 'bcd'
substring(startIndex, endIndex?)与 slice 类似,但如果 startIndex > endIndex 时处理参数的方式不同。'abcdef'.substring(1, 4) 的结果是 'bcd'
substr(startIndex, length?)(旧版/不推荐使用) 从 startIndex 开始,提取指定 length 长度的子字符串。'abcdef'.substr(1, 3) 的结果是 'bcd'
split(separator?, limit?)根据 separator 将字符串分割成子字符串数组。'a,b,c'.split(',') 的结果是 ['a', 'b', 'c']
replace(searchValue, newValue)返回一个新的字符串,将第一个匹配项(如果 searchValue 是全局正则表达式,则替换所有匹配项)替换掉。'hello'.replace('l', 'X') 的结果是 'heXlo'
replaceAll(searchValue, newValue)(ES2021) 返回一个新的字符串,将所有匹配项替换掉。'hello'.replaceAll('l', 'X') 的结果是 'heXXo'
toLowerCase()返回转换为小写字母的字符串。'HeLLo'.toLowerCase() 的结果是 'hello'
toUpperCase()返回转换为大写字母的字符串。'HeLLo'.toUpperCase() 的结果是 'HELLO'
trim()移除字符串两端的空白字符。' hello '.trim() 的结果是 'hello'
trimStart() / trimLeft()移除字符串开头的空白字符。' hello '.trimStart() 的结果是 'hello '
trimEnd() / trimRight()移除字符串末尾的空白字符。' hello '.trimEnd() 的结果是 ' hello'
startsWith(searchString, position?)检查字符串是否以 searchString 开头。'hello'.startsWith('he') 的结果是 true
endsWith(searchString, length?)检查字符串是否以 searchString 结尾。'hello'.endsWith('lo') 的结果是 true
includes(searchString, position?)检查字符串是否包含 searchString。'hello'.includes('ell') 的结果是 true
padStart(targetLength, padString?)用 padString 在字符串开头进行填充,直到达到 targetLength 长度。'5'.padStart(3, '0') 的结果是 '005'
padEnd(targetLength, padString?)用 padString 在字符串末尾进行填充,直到达到 targetLength 长度。'5'.padEnd(3, '0') 的结果是 '500'

JavaScript 和 TypeScript 中的字符串是不可变的 (immutable)。这意味着字符串方法不会修改原始字符串;它们总是返回一个带有更改的新字符串。

let originalString: string = "TypeScript";
let upperString = originalString.toUpperCase();
console.log(originalString); // Output: TypeScript (original is unchanged)
console.log(upperString); // Output: TYPESCRIPT (new string is returned)

字符串(原始类型) vs. 字符串对象包装器

Section titled “字符串(原始类型) vs. 字符串对象包装器”

虽然技术上可以使用 String 构造函数 (new String('hello')) 创建字符串,但这会在原始字符串外创建一个对象包装器。通常建议使用字符串字面量 ('hello'、"hello"、`hello`),它们会创建原始字符串值,性能更好,并且在使用 typeof 和 === 等运算符时行为更可预测。

let primitiveStr: string = "test";
let objectStr: String = new String("test");
console.log(typeof primitiveStr); // Output: string
console.log(typeof objectStr); // Output: object
console.log(primitiveStr === "test"); // Output: true
console.log(objectStr === "test"); // Output: false (object vs primitive)
console.log(objectStr.valueOf() === "test"); // Output: true (use valueOf() to get primitive)