本文系统总结了JavaScript中36个字符串方法,按照"增-截-改-查-判"分类整理。


详细列出各方法的参数、返回值及示例,包括concat()、slice()、replace()、indexOf()等常用方法。


特别说明废弃方法如substr()及其替代方案,并深入解析Unicode码元与码点的区别。


同时介绍了toLocaleString()和localeCompare()等国际化方法的应用场景,为开发者提供全面的字符串操作参考指南。


 本文可以看做是下列文章的升级版

JavaScript字符


 关联阅读推荐


JavaScript 正则表达式 API 总结


JavaScript 数组和字符串9个同名方法对比


JavaScript 字符串和数组方法总结(默写版)ES2023新增:toSorted(), toReversed(), toSpliced(), with()


JavaScript 36个字符串方法完整参数返回值表

总结:“增-截-改-查-判

分类 方法 参数 返回值 示例
concat() ...strings: string[] string "hello".concat(" ", "world") → "hello world"
repeat() count: number string "hello".repeat(2) → "hellohello"
padStart() targetLength: number, padString?: string string "hello".padStart(8, "x") → "xxxhello"
padEnd() targetLength: number, padString?: string string "hello".padEnd(8, "x") → "helloxxx"
slice() start: number, end?: number string "hello".slice(1, 4) → "ell"
substring() start: number, end?: number string "hello".substring(1, 4) → "ell"
substr() start: number, length?: number string "hello".substr(1, 3) → "ell"
改:大小写转换 toLowerCase() string "Hello".toLowerCase() → "hello"
toUpperCase() string "hello".toUpperCase() → "HELLO"
toLocaleLowerCase() locales?: string|string[] string "İ".toLocaleLowerCase("tr") → "i"
toLocaleUpperCase() locales?: string|string[] string "i".toLocaleUpperCase("tr") → "İ"
修改替换 replace() searchValue: string|RegExp, replaceValue: string string "hello".replace("l", "x") → "hexlo"
replaceAll() searchValue: string|RegExp, replaceValue: string string "hello".replaceAll("l", "x") → "hexxo"
trim() string " hello ".trim() → "hello"
trimStart() string " hello ".trimStart() → "hello "
trimEnd() string " hello ".trimEnd() → " hello"
分割转数组 split() separator: string|RegExp, limit?: number string[] "a,b,c".split(",") → ["a", "b", "c"]
normalize() form?: "NFC"|"NFD"|"NFKC"|"NFKD" string "café".normalize()
继承方法 valueOf() 返回 String 对象的原始值
toString() toString() 返回指定对象的字符串形式
toLocaleString() toLocaleString() 行为与 toString() 方法基本相同
查:字符访问 charAt() index: number string "hello".charAt(1) → "e"
charCodeAt() index: number number (Unicode) "hello".charCodeAt(1) → 101
codePointAt() index: number number "😀".codePointAt(0) → 128512
String.fromCharCode(101) 码元 接收任意数量的码元,返回对应字符拼接的字符串。
String.fromCodePoint(128552) 码点 接收任意数量的码点,返回对应字符拼接的字符串
查:索引 at() index: number (支持负数) string 或 undefined "hello".at(-1) → "o"
indexOf() searchString: string, position?: number number (索引或-1) "hello".indexOf("l") → 2
lastIndexOf() searchString: string, position?: number number (索引或-1) "hello".lastIndexOf("l") → 3
查:正则表达式 search() regexp: string|RegExp number (索引或-1) "hello".search(/[aeiou]/) → 1
match() regexp: string|RegExp Array 或 null "hello".match(/l/g) → ["l", "l"]
matchAll() regexp: RegExp (必须带g标志) Iterator [..."hello".matchAll(/l/g)]
includes() searchString: string, position?: number boolean "hello".includes("ell") → true
startsWith() searchString: string, position?: number boolean "hello".startsWith("he") → true
endsWith() searchString: string, length?: number boolean "hello".endsWith("lo") → true
字符串比较 localeCompare() 字符串比较:比较两个字符串,返回一个数字表示它们的相对顺序(-1、0 或 1)。
本地化排序:根据特定语言环境进行字符串排序,这对于处理不同语言的文本非常重要。
复杂排序:在数组的 sort() 方法中作为比较函数使用,特别是对包含国际字符的文本进行排序。
长度属性 length number "hello".length → 5

补充:JavaScript中支持正则表达式的(字符串)方法

最后两个是正则专用方法,其他是字符串方法。


参数类型详解表

参数类型 说明 常用方法
index: number 字符位置索引 charAtcharCodeAtat
searchString: string 要搜索的字符串 indexOfincludesstartsWithendsWith
position?: number 起始搜索位置 indexOflastIndexOfincludesstartsWith
start: number, end?: number 起始和结束位置 slicesubstring
start: number, length?: number 起始位置和长度 substr
regexp: string|RegExp 正则表达式 searchmatchreplace
replaceValue: string 替换字符串 replacereplaceAll
targetLength: number 目标长度 padStartpadEnd
separator: string|RegExp 分隔符 split
limit?: number 限制结果数量 split
count: number 重复次数 repeat

返回值类型分类表

返回值类型 方法 特点
string charAtslicesubstringsubstrtoLowerCasetoUpperCasereplacereplaceAllconcatrepeatpadStartpadEndtrimnormalize 返回新字符串
number charCodeAtcodePointAtindexOflastIndexOfsearchlength 返回数值
boolean includesstartsWithendsWith 判断结果
Array matchsplit 返回数组
Iterator matchAll 返回迭代器
null match (未匹配时) 匹配失败

JavaScript 废弃字符串方法总结


在 JavaScript 中,确实有一些字符串方法由于各种原因(如行为不一致、安全问题或违背现代 Web 标准)已被标记为已废弃(deprecated) 或不推荐使用。了解它们并掌握现代的替代方案,是编写健壮、可维护代码的关键。


下面用表格为你总结了这些方法及其替代方案。


📜 JavaScript 中已废弃或不推荐使用的字符串方法

废弃方法 简介与问题 现代替代方案
substr() 提取子字符串。它的第二个参数指定的是长度,这与 substring() 和 slice() 的结束索引容易混淆,导致代码可读性差且易出错。 使用 slice() 或 substring()
javascript<br>const str = "Hello, world!";<br>str.slice(7, 12); // "world" (推荐,支持负数索引)<br>str.substring(7, 12); // "world"<br>
escape() 对字符串进行编码。它是一个全局函数,主要用于早期 URL 编码,但不能正确处理所有 URI 字符(如 /:),且已被 Web 标准移除。 使用 encodeURI()(编码完整 URI)或 encodeURIComponent()(编码 URI 参数)。
javascript<br>encodeURIComponent("?name=张三"); // "%3Fname%3D%E5%BC%A0%E4%B8%89"<br>
unescape() 对 escape() 编码的字符串进行解码。与 escape() 配套,同样已废弃,且无法正确解码标准的 UTF-8 URL 编码。 使用 decodeURI() 或 decodeURIComponent() 。
javascript<br>decodeURIComponent("%E4%BD%A0%E5%A5%BD"); // "你好"<br>
anchor() 创建一个 HTML 锚点 (<a name="...">)。它生成的 <a> 标签使用已过时的 name 属性,且将 HTML 标记硬编码在 JS 中,既不安全(易受 XSS 攻击)也不利于维护 。 使用模板字符串或 DOM API 创建语义化的链接。
javascript<br>// 模板字符串<br>`<a href="#${id}">${text}</a>`<br>// DOM 操作<br>const a = document.createElement('a');<br>a.href = '#top';<br>a.textContent = '回到顶部';<br>
strike() 创建一个删除线 (<strike>...</strike>)。它将样式(划线)与内容混杂,且 <strike> 标签缺乏语义,违背了现代 Web 开发中“关注点分离”的原则 。 使用语义化的 HTML 标签(如 <del> 或 <s>)配合 CSS 样式 。
html<br><del>原价 $100</del><br>
HTML 包装方法
(如 bold()italics()fontsize()link() 等)
这是一整类用于生成 HTML 标签的方法。它们与 anchor() 和 strike() 存在同样的问题:将表现层代码(HTML)混杂在逻辑层(JavaScript)中,不利于维护和安全。 同样,推荐使用模板字符串来构建 HTML 片段,或者直接使用 DOM API 来操作元素和样式。

💡 核心要点

  1. 关注点分离:废弃的 HTML 包装方法(如 anchor()strike()bold())最大的问题在于混淆了内容/结构(HTML)样式(CSS) 和行为(JavaScript)。现代开发提倡将它们清晰地分离开。

  2. 标准化与安全性escape/unescape 是非标准化的,而 encodeURI/decodeURIComponent 是 ECMAScript 的全局标准方法,行为一致且可靠。在处理用户输入并构建 HTML 时,使用 DOM API 或安全的转义方法可以有效避免跨站脚本攻击(XSS)。

  3. 语义化:用 <del>(表示删除的内容)替代 <strike>(仅表示划线样式),能让你的 HTML 代码更具可读性,对搜索引擎和辅助技术(如屏幕阅读器)更友好 。


码元(Code Unit)与码点(Code Point)

在JavaScript中处理字符串时,理解Unicode字符、码点和码元的区别非常重要。

码点(Code Point)

码点是Unicode标准中每个字符的唯一编号。例如:

  • 字母"A"的码点是U+0041
  • 汉字"中"的码点是U+4E2D
  • 笑脸表情"😀"的码点是U+1F600

码元(Code Unit)

码元是特定编码格式中表示字符的最小单位:

  • 在UTF-16中,码元是16位(2字节)
  • 在UTF-8中,码元是8位(1字节)
  • 在ASCII中,码元是7位(通常存储为8位)

基本多文种平面(BMP)与代理对

Unicode字符分为:

  • BMP字符:码点范围U+0000到U+FFFF,可以用一个UTF-16码元表示
  • 辅助平面字符:码点范围U+10000到U+10FFFF,需要用两个UTF-16码元(代理对)表示

toLocaleString()

JavaScript 字符串拥有 toLocaleString() 方法,但这个方法是从 Object.prototype 继承而来的。

详细说明:

  1. 继承关系

    • 在JavaScript中,所有对象都继承自 Object.prototype
    • String 对象也不例外,它继承了 Object.prototype 上的所有方法
    • 因此,字符串(包括字符串对象和字符串原始值)都有 toLocaleString() 方法
  2. String.prototype.toLocaleString() 的行为

    • 对于字符串来说,toLocaleString() 方法与 toString() 方法的行为基本相同
    • 它不会像 Number 或 Date 对象那样进行本地化格式化
    • 它只是简单地返回字符串本身

对于字符串对象,String.prototype.toLocaleString() 方法的行为与 toString() 方法基本相同。它不会根据语言环境进行特殊处理,而是直接返回字符串本身。

对于数字,toLocaleString() 方法特别有用,可以格式化数字以符合特定地区的格式,包括千位分隔符、小数点格式等。

const date = new Date();

// 英式英语格式
console.log(date.toLocaleString('en-GB', {
  weekday: 'long',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}));
// 输出:"Sunday, 12 November 2023"

// 中文格式
console.log(date.toLocaleString('zh-CN', {
  weekday: 'long',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
}));
// 输出:"2023年11月12日星期日"

在实际开发中,toLocaleString() 方法特别适用于:

  1. 国际化应用:根据不同地区显示数字和日期
  2. 货币格式化:显示符合当地习惯的货币格式
  3. 用户界面本地化:让应用显示符合用户地区习惯的格式

总的来说,toLocaleString() 是 JavaScript 中一个强大的本地化工具,尤其在处理数字和日期格式时非常有用。对于字符串数组,它与 toString() 方法效果相同,但对于数字和日期数组,它可以提供符合地区习惯的格式化输出。


localeCompare()方法示例

// 基本用法
"apple".localeCompare("banana"); // 返回 -1

// 指定语言环境
"a".localeCompare("b", "zh"); // 根据中文语言环境比较

// 带选项的比较
"a".localeCompare("b", "zh", { sensitivity: "base" });

// 在数组排序中的应用
const fruits = ['香蕉', '苹果', '橙子'];
fruits.sort((a, b) => a.localeCompare(b, 'zh'));
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐