字符串对象
String 对象用于表示和操作一系列字符。在 JavaScript 中,字符串是不可变的原始值,但可以通过 String 对象的方法来操作它们。
创建字符串
有多种方式可以创建字符串:
字符串字面量
javascript
let str1 = "双引号字符串";
let str2 = '单引号字符串';
let str3 = `模板字符串`;String 构造函数
javascript
let str = new String("使用构造函数创建的字符串");
console.log(typeof str); // "object"
console.log(str instanceof String); // true
// 注意:使用构造函数创建的是 String 对象,不是原始字符串
let str1 = "hello";
let str2 = new String("hello");
console.log(str1 == str2); // true (值相等)
console.log(str1 === str2); // false (类型不同)字符串属性
length 属性
javascript
let str = "Hello, World!";
console.log(str.length); // 13访问字符串字符
javascript
let str = "JavaScript";
// 使用索引访问字符
console.log(str[0]); // "J"
console.log(str[4]); // "S"
// 使用 charAt 方法
console.log(str.charAt(0)); // "J"
console.log(str.charAt(4)); // "S"
// 使用 charCodeAt 方法获取字符的 Unicode 值
console.log(str.charCodeAt(0)); // 74 (J 的 Unicode 值)
// 使用 at 方法(ES2022)
console.log(str.at(0)); // "J"
console.log(str.at(-1)); // "t" (负索引,从末尾开始)字符串方法
查找方法
javascript
let str = "Hello, JavaScript! Welcome to JavaScript world!";
// indexOf - 查找子字符串第一次出现的位置
console.log(str.indexOf("JavaScript")); // 7
console.log(str.indexOf("JavaScript", 10)); // 29 (从索引 10 开始查找)
// lastIndexOf - 查找子字符串最后一次出现的位置
console.log(str.lastIndexOf("JavaScript")); // 29
// includes - 检查是否包含子字符串
console.log(str.includes("JavaScript")); // true
console.log(str.includes("Java", 10)); // true (从索引 10 开始检查)
// startsWith - 检查是否以指定字符串开头
console.log(str.startsWith("Hello")); // true
console.log(str.startsWith("JavaScript", 7)); // true (从索引 7 开始检查)
// endsWith - 检查是否以指定字符串结尾
console.log(str.endsWith("world!")); // true
console.log(str.endsWith("JavaScript", 17)); // true (检查前 17 个字符)提取方法
javascript
let str = "Hello, JavaScript!";
// substring - 提取指定范围的字符
console.log(str.substring(0, 5)); // "Hello"
console.log(str.substring(7)); // "JavaScript!"
// slice - 提取指定范围的字符(支持负数索引)
console.log(str.slice(0, 5)); // "Hello"
console.log(str.slice(-11, -1)); // "JavaScript"
console.log(str.slice(-1)); // "!"
// substr - 提取从指定位置开始的指定长度的字符(已废弃,但仍可用)
console.log(str.substr(0, 5)); // "Hello"
console.log(str.substr(7, 10)); // "JavaScript"转换方法
javascript
let str = "Hello, JavaScript!";
// toUpperCase - 转换为大写
console.log(str.toUpperCase()); // "HELLO, JAVASCRIPT!"
// toLowerCase - 转换为小写
console.log(str.toLowerCase()); // "hello, javascript!"
// trim - 去除首尾空白字符
let strWithSpaces = " Hello, World! ";
console.log(strWithSpaces.trim()); // "Hello, World!"
// trimStart - 去除开头空白字符
console.log(strWithSpaces.trimStart()); // "Hello, World! "
// trimEnd - 去除结尾空白字符
console.log(strWithSpaces.trimEnd()); // " Hello, World!"连接和重复方法
javascript
let str1 = "Hello";
let str2 = "World";
// concat - 连接字符串
console.log(str1.concat(", ", str2, "!")); // "Hello, World!"
// repeat - 重复字符串
console.log(str1.repeat(3)); // "HelloHelloHello"
console.log("=".repeat(10)); // "=========="分割和替换方法
javascript
let str = "apple,banana,orange,grape";
// split - 分割字符串为数组
console.log(str.split(",")); // ["apple", "banana", "orange", "grape"]
console.log(str.split(",", 2)); // ["apple", "banana"] (限制数组长度)
console.log("hello".split("")); // ["h", "e", "l", "l", "o"]
// replace - 替换第一个匹配的子字符串
console.log(str.replace("banana", "kiwi")); // "apple,kiwi,orange,grape"
// replaceAll - 替换所有匹配的子字符串(ES2021)
console.log("banana banana".replaceAll("banana", "kiwi")); // "kiwi kiwi"
// 使用正则表达式替换
console.log(str.replace(/apple|orange/g, "fruit")); // "fruit,banana,fruit,grape"模板字符串
javascript
let name = "张三";
let age = 25;
// 基本用法
let greeting = `你好,我是${name},今年${age}岁。`;
console.log(greeting); // "你好,我是张三,今年25岁。"
// 多行字符串
let multiline = `
这是第一行
这是第二行
这是第三行
`;
console.log(multiline);
// 表达式
let a = 5;
let b = 10;
console.log(`a + b = ${a + b}`); // "a + b = 15"
console.log(`a * b = ${a * b}`); // "a * b = 50"
// 嵌套模板字符串
let greetingTemplate = `你好,${name}!${age > 18 ? '你已经成年了' : '你还未成年'}`;
console.log(greetingTemplate); // "你好,张三!你已经成年了"标签模板
javascript
// 标签函数
function highlight(strings, ...values) {
let result = "";
strings.forEach((string, i) => {
result += string;
if (values[i]) {
result += `<strong>${values[i]}</strong>`;
}
});
return result;
}
let name = "张三";
let age = 25;
let message = highlight`你好,我是${name},今年${age}岁。`;
console.log(message); // "你好,我是<strong>张三</strong>,今年<strong>25</strong>岁。"字符串迭代
javascript
let str = "Hello";
// 使用 for...of 循环
for (let char of str) {
console.log(char);
}
// 输出:H e l l o
// 转换为数组
let chars = [...str];
console.log(chars); // ["H", "e", "l", "l", "o"]
// 使用 Array.from
let chars2 = Array.from(str);
console.log(chars2); // ["H", "e", "l", "l", "o"]字符串编码
javascript
let str = "Hello, 世界";
// 获取字符的 Unicode 值
console.log(str.charCodeAt(0)); // 72 (H)
console.log(str.charCodeAt(7)); // 19990 (世)
// 从 Unicode 值创建字符
console.log(String.fromCharCode(72, 101, 108, 108, 111)); // "Hello"
// ES6 的 codePointAt 和 fromCodePoint(支持 Unicode 码点)
console.log(str.codePointAt(7)); // 19990 (世)
console.log(String.fromCodePoint(19990, 30028)); // "世界"字符串比较
javascript
let str1 = "a";
let str2 = "b";
// 基本比较
console.log(str1 < str2); // true
// localeCompare 方法
console.log("ä".localeCompare("z")); // -1 (在德语中 ä 排在 z 之前)
console.log("ä".localeCompare("z", "sv")); // -1 (在瑞典语中 ä 排在 z 之前)原始字符串
javascript
// String.raw 标签函数
let filePath = String.raw`C:\Users\Name\Documents`;
console.log(filePath); // "C:\Users\Name\Documents" (不会转义反斜杠)
let template = String.raw`Hello\nWorld`;
console.log(template); // "Hello\nWorld" (不会转义换行符)最佳实践
使用字符串字面量:创建字符串时优先使用字面量而不是构造函数。
优先使用模板字符串:需要字符串插值或跨行字符串时使用模板字符串。
注意字符串不可变性:字符串方法不会修改原字符串,而是返回新字符串。
javascript
let str = "Hello";
str.toUpperCase(); // 不会修改 str
console.log(str); // "Hello"
// 需要保存结果
let upperStr = str.toUpperCase();
console.log(upperStr); // "HELLO"使用适当的查找方法:
- 只需要检查是否存在时使用
includes - 需要位置时使用
indexOf - 需要从末尾查找时使用
lastIndexOf
- 只需要检查是否存在时使用
避免使用已废弃的方法:如
substr已被废弃,应使用substring或slice。注意性能:大量字符串连接时考虑使用数组 join 方法。
javascript
// 性能较差
let result = "";
for (let i = 0; i < 1000; i++) {
result += "字符串" + i;
}
// 性能较好
let parts = [];
for (let i = 0; i < 1000; i++) {
parts.push("字符串" + i);
}
let result = parts.join("");String 对象提供了丰富的字符串操作方法,掌握这些方法对于处理文本数据至关重要。