JavaScript: JavaScript 字符串

字符串是 JavaScript 中最常用的数据类型之一。你每天写的代码里,十有八九都在跟字符串打交道——显示文字、拼接消息、处理用户输入,哪样都离不开它。

1. 字符串的创建

JavaScript 提供了三种方式创建字符串:单引号、双引号和反引号。

HTML
<script>
let a = 'hello';     // 单引号
let b = "world";     // 双引号
let c = `hello`;     // 反引号
</script>

单引号和双引号没有本质区别,选哪个全看你心情。但反引号就不一样了——它支持模板字符串,功能更强大,后面会细说。

💡 提示: 团队协作时,建议统一用单引号或双引号,别混着来,代码看着干净。


▶ 示例

JAVASCRIPT
// 本节代码示例
const message = "你好,世界!";
console.log(message);
▶ 试一试

这是最简单的示例,后续章节会详细解释。## 2. 字符串是不可变的

这是很多人踩过的坑:字符串一旦创建,内容就不能修改。你调用的所有方法,都不会改变原字符串,而是返回一个新字符串

HTML
<script>
let str = 'hello';
str[0] = 'H';       // 静默失败,str 还是 'hello'
str.toUpperCase();   // 返回 'HELLO',但 str 本身不变
let upper = str.toUpperCase(); // 这才对,用变量接住返回值
</script>

记住:字符串方法不改变原值,必须用变量接收返回值。


3. 常用方法

JavaScript 字符串方法非常多,但日常最常用的就这几个:

方法 作用 示例
length 获取长度 'abc'.length3
indexOf() 查找子串位置 'hello'.indexOf('ll')2
slice() 截取子串 'hello'.slice(1,3)'el'
replace() 替换内容 'cat'.replace('c','b')'bat'
toUpperCase() 转大写 'hi'.toUpperCase()'HI'
toLowerCase() 转小写 'HI'.toLowerCase()'hi'
trim() 去首尾空格 ' hi '.trim()'hi'
split() 按分隔符拆成数组 'a,b'.split(',')['a','b']
includes() 是否包含子串 'hello'.includes('ell')true
startsWith() 是否以某串开头 'hello'.startsWith('he')true
endsWith() 是否以某串结尾 'hello'.endsWith('lo')true

▶ 示例:字符串常用方法

HTML
<!DOCTYPE html>
<html>
<body>
  <h2>字符串常用方法</h2>
  <p id="output"></p>
  <script>
    let str = '  Hello, JavaScript!  ';
    let result = '';
    result += '原始: "' + str + '"<br>';
    result += 'length: ' + str.length + '<br>';
    result += 'trim: "' + str.trim() + '"<br>';
    result += 'indexOf("Java"): ' + str.indexOf('Java') + '<br>';
    result += 'slice(2,7): "' + str.slice(2, 7) + '"<br>';
    result += 'includes("Script"): ' + str.includes('Script') + '<br>';
    result += 'startsWith("  H"): ' + str.startsWith('  H') + '<br>';
    result += 'toUpperCase: ' + str.toUpperCase() + '<br>';
    result += 'replace("JavaScript","World"): ' + str.replace('JavaScript', 'World') + '<br>';
    document.getElementById('output').innerHTML = result;
  </script>
</body>
</html>
▶ 试一试

注意 slice(start, end) 截取的范围是包含 start,不包含 end。这跟很多语言一样,习惯就好。


4. 模板字符串

反引号(`)创建的字符串叫模板字符串,它有两个杀手锏:

  1. 支持换行——不用再写 \n,直接敲回车
  2. 支持插值——用 ${变量} 嵌入变量或表达式
HTML
<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>模板字符串</title></head>
<body>
<div id="output"></div>
<script>
let name = '小明';
let age = 20;

// 以前:拼字符串,容易漏加号
let msg1 = '我叫' + name + ',今年' + age + '岁。';

// 现在:模板字符串,清爽多了
let msg2 = `我叫${name},今年${age}岁。`;

document.getElementById('output').innerHTML =
  '<strong>拼接方式:</strong>' + msg1 + '<br>' +
  '<strong>模板字符串:</strong>' + msg2;
</script>
</body>
</html>

▶ 示例:模板字符串 vs 拼接

HTML
<!DOCTYPE html>
<html>
<body>
  <h2>模板字符串对比</h2>
  <p id="output"></p>
  <script>
    let name = '小红';
    let city = '北京';
    let hobby = '画画';

    let old = '我叫' + name + ',来自' + city + ',喜欢' + hobby + '。';
    let modern = `我叫${name},来自${city},喜欢${hobby}。`;

    let html = '<strong>拼接方式:</strong>' + old + '<br><br>';
    html += '<strong>模板字符串:</strong>' + modern + '<br><br>';

    let a = 5, b = 3;
    html += `<strong>还能写表达式:</strong>${a} + ${b} = ${a + b}<br>`;
    html += `<strong>还能调用方法:</strong>${name.toUpperCase()}`;

    document.getElementById('output').innerHTML = html;
  </script>
</body>
</html>
▶ 试一试
💡 提示: 变量多的时候,模板字符串比拼接好读十倍。别犹豫,日常写代码优先用反引号。


5. 转义字符

有些字符在字符串里有特殊含义,想输出它们本身,就需要用反斜杠 \ 转义:

转义字符 含义
\n 换行
\t 制表符(Tab)
\\ 反斜杠本身
\" 双引号
\' 单引号

▶ 示例:转义字符

HTML
<!DOCTYPE html>
<html>
<body>
  <h2>转义字符演示</h2>
  <p id="output"></p>
  <script>
    let s1 = '第一行\n第二行';
    let s2 = '名字\t年龄\t城市';
    let s3 = '路径:C:\\Users\\Admin';
    let s4 = '他说:"你好!"';
    let s5 = 'It\'s a nice day';

    let html = '';
    html += '<strong>\\n 换行:</strong><pre>' + s1 + '</pre>';
    html += '<strong>\\t 制表符:</strong><pre>' + s2 + '</pre>';
    html += '<strong>\\\\ 反斜杠:</strong>' + s3 + '<br>';
    html += '<strong>\\" 双引号:</strong>' + s4 + '<br>';
    html += "<strong>\\' 单引号:</strong>" + s5 + '<br>';

    document.getElementById('output').innerHTML = html;
  </script>
</body>
</html>
▶ 试一试
⚠️ 注意: 反斜杠自己也要转义。写 Windows 路径时 C:\Users 得写成 C:\\Users,忘转义的话分分钟出 bug。


6. 字符串拼接 vs 模板字符串

简单场景下两种方式都行,但变量一多,拼接就开始让人头疼:

HTML
<script>
// 拼接:变量一多就容易漏加号、多加号
let html = '<div class="' + cls + '">' + title + '</div>';

// 模板:一目了然
let html = `<div class="${cls}">${title}</div>`;
</script>

▶ 示例:生成 HTML 内容

HTML
<!DOCTYPE html>
<html>
<body>
  <h2>用模板字符串生成内容</h2>
  <div id="output"></div>
  <script>
    let products = [
      { name: '笔记本', price: 4999 },
      { name: '鼠标', price: 89 },
      { name: '键盘', price: 399 }
    ];

    let html = '<ul>';
    for (let p of products) {
      html += `<li>${p.name} - ¥${p.price.toFixed(2)}</li>`;
    }
    html += '</ul>';

    document.getElementById('output').innerHTML = html;
  </script>
</body>
</html>
▶ 试一试

模板字符串嵌在循环里生成 HTML,这在实际开发中非常常见,比拼接舒服太多。


❓ 常见问题

Q indexOfincludes 有什么区别?
A indexOf 返回子串的起始位置(找不到返回 -1),includes 返回布尔值。如果你只关心"有没有",用 includes 更直观;如果需要知道具体位置,用 indexOf
Q replace 为什么只替换第一个匹配?
A replace 默认只替换第一个匹配项。要替换所有,用 replaceAll,或用正则表达式加 g 标志:str.replace(/abc/g, 'xyz')
Q 单引号和双引号到底用哪个?
A 功能完全一样。团队里统一就行,大多数项目约定用单引号,字符串内包含单引号时用双引号包起来。

📖 小节

📝 作业

  1. 写一个程序,让用户输入一句英文,输出单词个数(提示:用 split 按空格拆分,再用 length
  2. 写一个程序,把字符串 " Hello World " 处理成全小写、去空格的 "hello world",用到 trimtoLowerCase
  3. 用模板字符串生成一段自我介绍 HTML,包含姓名、年龄、爱好(用变量),并将结果显示在页面上
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏