TypeScript - 字符串
TypeScript - 字符串
Section titled “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模板字面量 (Template Strings)
Section titled “模板字面量 (Template Strings)”模板字面量(用反引号 (`) 包围)是处理字符串的现代且首选方式,尤其适用于嵌入表达式或创建多行字符串。
- 嵌入表达式: 使用
${expression}语法,直接在字符串中嵌入变量或任何有效的 JavaScript 表达式。 - 多行字符串: 模板字面量会保留反引号内的换行符。
let userName: string = "Alice";let userAge: number = 30;
// Using embedded expressionslet message: string = `Welcome, ${userName}! You are ${userAge} years old.`;console.log(message);// Output: Welcome, Alice! You are 30 years old.
// Multi-line stringlet poem: string = `Roses are red,Violets are blue,TypeScript is fun,And so are you!`;console.log("\nPoem:\n" + poem);常用字符串属性和方法
Section titled “常用字符串属性和方法”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' |
字符串的不可变性
Section titled “字符串的不可变性”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: stringconsole.log(typeof objectStr); // Output: object
console.log(primitiveStr === "test"); // Output: trueconsole.log(objectStr === "test"); // Output: false (object vs primitive)console.log(objectStr.valueOf() === "test"); // Output: true (use valueOf() to get primitive)