讲解
字符串是文本数据,用单引号、双引号或反引号(模板字符串,后面有专门章节)包起来。字符串是不可变的:所有「修改」字符串的方法实际上都返回一个新字符串,原字符串纹丝不动。这点和其他语言(如 Python)一致,习惯了就好。
字符串有 length 属性表示长度,可以用 str[0] 或 str.charAt(0) 按下标取字符。要注意 length 数的是 UTF-16 码元而不是「人眼看到的字符」:绝大多数汉字长度是 1,但很多 emoji(如 👨👩👧)长度大于 1,按码元切开可能得到乱码。需要按真实字符遍历字符串时,用 for...of 或 [...str],它们按码点迭代,对 emoji 更安全。
常用方法务必熟练:slice(start, end) 截取(支持负数下标从尾部数)、includes/indexOf 查找、startsWith/endsWith 判断开头结尾、toUpperCase/toLowerCase 转大小写、trim 去掉两端空白、split 按分隔符拆成数组、replace/replaceAll 替换、padStart/padEnd 补齐长度、repeat 重复。这些方法全部是返回新字符串,链式调用是常见风格。
示例
const text = ' JavaScript 很有趣 ';
console.log('长度:', text.length);
console.log('去空格:', text.trim());
console.log('大写:', text.trim().toUpperCase());
const url = 'https://docs.ohmygp.com/javascript/strings';
console.log('以 https 开头:', url.startsWith('https'));
console.log('包含 docs:', url.includes('docs'));
console.log('截取:', url.slice(8, 20));
console.log('倒数截取:', url.slice(-7)); // 'strings'
console.log('拆分:', url.split('/').length, '段');
// emoji 的长度陷阱与按字符遍历
const s = 'a👍b';
console.log('码元长度:', s.length); // 4
console.log('真实字符:', [...s]); // ['a', '👍', 'b']
console.log('替换:', 'aaa'.replace('a', 'b'), 'aaa'.replaceAll('a', 'b'));
console.log('补齐:', '7'.padStart(3, '0'), 'abc'.padEnd(6, '.'));
常见坑
- substring 与 slice 混淆:substring 不支持负数下标,且会自动交换大小参数。现代代码统一用 slice。
- 期待方法修改原字符串:str.toUpperCase() 之后 str 不会变,必须接收返回值:str = str.toUpperCase()。
- 用 == 比较字符串时忽略大小写:比较用户输入前先统一 toLowerCase() 或 toUpperCase(),再比较。
- split('') 切 emoji:'👍'.split('') 会得到两个半个的乱码字符,要按字符拆用 [...str] 或 Array.from(str)。
小结
字符串不可变,所有方法返回新串;slice、includes、trim、split、replace 是最高频的五个方法。处理 emoji 时记住码元与码点的区别。下一节看另一种基础类型:数字。