JavaScript里的string
一、字符串的创建方式
1. 字面量方式(推荐)
const str1 = 'Hello'; // 单引号
const str2 = "World"; // 双引号
const str3 = `Hello, ${str2}!`; // 反引号(模板字符串,支持变量和换行)
2. 构造函数方式(创建字符串对象)
const strObj = new String('Hello');
console.log(typeof strObj); // "object"(注意:是对象类型)
console.log(strObj.valueOf()); // "Hello"(获取原始值)
通常推荐使用字面量方式,因为字符串对象在比较和使用时可能产生意外(如
new String('a') === 'a'
为false
)。
二、字符串的核心特性
- 不可变性
字符串一旦创建,其字符就不能被修改(所有字符串方法都会返回新字符串,不改变原字符串):
let str = 'abc';str[0] = 'A'; // 尝试修改第一个字符(无效)console.log(str); // "abc"(原字符串不变)
- 可索引访问
可以通过索引(从0
开始)访问单个字符:
const str = 'hello';console.log(str[0]); // "h"console.log(str[str.length - 1]); // "o"(最后一个字符)
- 长度属性
length
用于获取字符串的字符数量:
const str = 'Hello World';console.log(str.length); // 11(包含空格)
三、常用字符串方法
1. 查找与定位
indexOf(searchValue, startIndex)
:返回子串首次出现的索引(未找到返回-1
)
const str = 'hello world';console.log(str.indexOf('o')); // 4console.log(str.indexOf('o', 5)); // 7(从索引5开始找)
-
lastIndexOf(searchValue)
:返回子串最后一次出现的索引console.log(str.lastIndexOf('o')); // 7
-
includes(searchValue)
:判断字符串是否包含子串(返回布尔值)console.log(str.includes('world')); // true
-
startsWith(searchValue)
/endsWith(searchValue)
:判断是否以子串开头/结尾console.log(str.startsWith('hello')); // true console.log(str.endsWith('d')); // true
2. 截取与提取
-
slice(startIndex, endIndex)
:截取从start
到end
(不包含end
)的子串const str = 'abcdef'; console.log(str.slice(1, 4)); // "bcd" console.log(str.slice(2)); // "cdef"(从索引2到结尾) console.log(str.slice(-3)); // "def"(负数表示从末尾开始)
-
substring(startIndex, endIndex)
:类似slice
,但不支持负数索引 -
substr(startIndex, length)
:从start
开始截取指定长度的子串(ES6 后不推荐)
3. 转换与替换
-
toUpperCase()
/toLowerCase()
:转换为大写/小写const str = 'Hello World'; console.log(str.toUpperCase()); // "HELLO WORLD" console.log(str.toLowerCase()); // "hello world"
-
replace(searchValue, replacement)
:替换子串(默认只替换第一个匹配项)console.log(str.replace('World', 'JavaScript')); // "Hello JavaScript" // 全局替换(用正则表达式) console.log('aaa'.replace(/a/g, 'b')); // "bbb"
-
split(separator)
:将字符串按分隔符拆分为数组const str = 'a,b,c,d'; console.log(str.split(',')); // ["a", "b", "c", "d"] console.log('hello'.split('')); // ["h", "e", "l", "l", "o"](拆分为单个字符)
4. 其他常用方法
-
trim()
:去除字符串前后的空白字符(空格、制表符、换行等)const str = ' hello '; console.log(str.trim()); // "hello"
-
repeat(count)
:将字符串重复指定次数console.log('ab'.repeat(3)); // "ababab"
-
charAt(index)
:返回指定索引的字符(与str[index]
类似)console.log('hello'.charAt(2)); // "l"
四、模板字符串(反引号 `
)
ES6 引入的模板字符串提供了更强大的字符串处理能力:
- 支持多行文本(无需手动加
\n
):
const multiLine = `第一行
第二行
第三行`;
- 嵌入变量或表达式(用
${}
包裹):
const name = '张三';
const age = 18;
const info = `姓名:${name},年龄:${age + 1}`;
console.log(info); // "姓名:张三,年龄:19"
- 支持表达式计算:
const result = `1 + 2 = ${1 + 2}`;console.log(result); // "1 + 2 = 3"
五、字符串与数组的转换
- 字符串 → 数组:用
split('')
或扩展运算符[...str]
const str = 'hello';console.log([...str]); // ["h", "e", "l", "l", "o"]
- 数组 → 字符串:用
Array.join('')
const arr = ['h', 'i'];console.log(arr.join('')); // "hi"