JavaScript中的String研究03:实例方法——isWellFormed、lastIndexOf、localeCompare、match、matchAll、normalize、padEnd、padStart
在JavaScript中,String
对象提供了丰富的实例方法。本篇文章将深入探讨以下常用的String
实例方法:
isWellFormed()
lastIndexOf()
localeCompare()
match()
matchAll()
normalize()
padEnd()
padStart()
一、isWellFormed()
1. 定义
isWellFormed()
方法用于检查字符串是否是格式良好的Unicode字符串。如果字符串中不包含任何不匹配的代理对(surrogate pairs),则返回true
;否则返回false
。
2. 语法
str.isWellFormed()
3. 用途
- 检查字符串是否包含无效的Unicode字符。
- 确保字符串在处理高位字符(如Emoji、特殊符号)时的正确性。
4. 示例
let validStr = 'Hello World';
console.log(validStr.isWellFormed()); // true
let invalidStr = 'High surrogate \uD800 without low surrogate';
console.log(invalidStr.isWellFormed()); // false
5. 注意事项
isWellFormed()
是ES2023(ES14)引入的新方法,旧版本的浏览器或运行环境可能不支持。- 对于不匹配的代理对,可能会导致字符串处理出错,因此使用该方法可以预先检测。
二、lastIndexOf()
1. 定义
lastIndexOf()
方法返回指定子字符串在字符串中最后一次出现的位置,如果未找到则返回-1
。
2. 语法
str.lastIndexOf(searchValue[, fromIndex])
searchValue
:要搜索的子字符串。fromIndex
:可选,从该索引位置开始反向搜索,默认值为str.length - 1
。
3. 用途
- 查找子字符串在字符串中最后一次出现的位置。
- 判断子字符串是否存在,以及其最后出现的位置。
4. 示例
let str = "Can you can a can as a canner can can a can?";
console.log(str.lastIndexOf("can")); // 31
console.log(str.lastIndexOf("can", 30)); // 21
console.log(str.lastIndexOf("can", 20)); // 12
console.log(str.lastIndexOf("can", 10)); // 7
console.log(str.lastIndexOf("cat")); // -1
5. 注意事项
- 方法区分大小写。
- 如果未找到子字符串,返回
-1
。
三、localeCompare()
1. 定义
localeCompare()
方法返回一个数字,指示参考字符串在排序时应该位于被比较字符串的前面、后面或相同位置。该方法使用特定语言环境的排序规则。
2. 语法
referenceStr.localeCompare(compareString[, locales[, options]])
compareString
:要比较的字符串。locales
:可选,指定用于比较的语言环境。options
:可选,指定比较的配置选项。
3. 用途
- 根据语言环境,对字符串进行排序和比较。
- 适用于国际化(i18n)应用程序中的字符串排序。
4. 示例
let a = 'ä';
let b = 'z';
console.log(a.localeCompare(b)); // 在某些语言环境下可能为-1、0或1
// 指定语言环境为德语
console.log(a.localeCompare(b, 'de')); // -1
// 指定语言环境为瑞典语
console.log(a.localeCompare(b, 'sv')); // 1
5. 注意事项
- 不同的语言环境可能会导致不同的比较结果。
options
参数可以指定比较的敏感度,如{ sensitivity: 'base' }
。
四、match()
1. 定义
match()
方法用于检索字符串中匹配正则表达式的结果。
2. 语法
str.match(regexp)
regexp
:一个正则表达式对象。如果传入的是非正则表达式,则会使用new RegExp(obj)
将其转换为正则表达式。
3. 用途
- 根据正则表达式,检索字符串中的匹配项。
- 获取匹配结果数组或
null
。
4. 示例
let str = "The rain in SPAIN stays mainly in the plain";
// 匹配所有包含'ain'的单词,区分大小写
let result = str.match(/ain/g);
console.log(result); // ["ain", "ain", "ain"]
// 使用忽略大小写的标志
result = str.match(/ain/gi);
console.log(result); // ["ain", "AIN", "ain", "ain"]
// 匹配失败的情况
result = str.match(/xyz/);
console.log(result); // null
5. 注意事项
- 如果正则表达式使用了全局标志
g
,则返回所有匹配项的数组;否则返回匹配信息的数组,其中包含捕获组等信息。 - 如果未找到匹配,返回
null
。
五、matchAll()
1. 定义
matchAll()
方法返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器。
2. 语法
str.matchAll(regexp)
regexp
:一个带有全局标志g
或粘性标志y
的正则表达式对象。
3. 用途
- 获取所有匹配结果的详细信息,包括捕获组。
- 适用于需要遍历所有匹配项的情况。
4. 示例
let str = "test1test2test3";
let regexp = /t(e)(st(\d?))/g;
let matches = str.matchAll(regexp);
for (let match of matches) {
console.log(`Found ${match[0]} at index ${match.index}`);
console.log(`Group 1: ${match[1]}`);
console.log(`Group 2: ${match[2]}`);
console.log(`Group 3: ${match[3]}`);
}
输出:
Found test1 at index 0
Group 1: e
Group 2: st1
Group 3: 1
Found test2 at index 5
Group 1: e
Group 2: st2
Group 3: 2
Found test3 at index 10
Group 1: e
Group 2: st3
Group 3: 3
5. 注意事项
matchAll()
返回的是一个迭代器,需要使用for...of
循环或展开运算符...
来获取结果。- 正则表达式必须具有全局
g
或粘性y
标志,否则会抛出TypeError
。
六、normalize()
1. 定义
normalize()
方法按照指定的Unicode标准,将字符串正规化。
2. 语法
str.normalize([form])
form
:可选,指定正规化的形式,可能的值有"NFC"
、"NFD"
、"NFKC"
、"NFKD"
,默认值为"NFC"
。
3. 用途
- 将字符串转换为标准的Unicode形式,便于比较和存储。
- 处理包含重音符号、组合字符等特殊字符的字符串。
4. 示例
let str1 = "\u00F1"; // 拉丁字母 'ñ' 的单一字符
let str2 = "\u006E\u0303"; // 'n' 和 '~' 的组合
console.log(str1 === str2); // false
// 进行正规化
let normalizedStr1 = str1.normalize("NFC");
let normalizedStr2 = str2.normalize("NFC");
console.log(normalizedStr1 === normalizedStr2); // true
5. 注意事项
- 正规化形式:
- NFC(Normalization Form Canonical Composition):标准等价合成。
- NFD(Normalization Form Canonical Decomposition):标准等价分解。
- NFKC(Normalization Form Compatibility Composition):兼容等价合成。
- NFKD(Normalization Form Compatibility Decomposition):兼容等价分解。
- 使用正规化可以避免由于字符表示不同而导致的比较问题。
七、padEnd()
1. 定义
padEnd()
方法通过在字符串的末尾填充指定的字符串,使原字符串达到指定的长度。
2. 语法
str.padEnd(targetLength[, padString])
targetLength
:填充后字符串的目标长度。如果该值小于原字符串长度,则返回原字符串。padString
:可选,填充用的字符串,默认值为" "
(空格)。
3. 用途
- 对字符串进行右侧填充,使其达到统一的长度,常用于格式化输出。
4. 示例
let str = "Hello";
console.log(str.padEnd(10)); // "Hello "
console.log(str.padEnd(10, ".")); // "Hello....."
console.log(str.padEnd(10, "123")); // "Hello12312"
5. 注意事项
padString
如果过长,会被截断以适应目标长度。- 如果
targetLength
小于或等于原字符串长度,返回原字符串。
八、padStart()
1. 定义
padStart()
方法通过在字符串的开头填充指定的字符串,使原字符串达到指定的长度。
2. 语法
str.padStart(targetLength[, padString])
targetLength
:填充后字符串的目标长度。如果该值小于原字符串长度,则返回原字符串。padString
:可选,填充用的字符串,默认值为" "
(空格)。
3. 用途
- 对字符串进行左侧填充,使其达到统一的长度,常用于格式化输出,如数字补零等。
4. 示例
let str = "5";
console.log(str.padStart(2, "0")); // "05"
console.log(str.padStart(5, "*")); // "****5"
console.log(str.padStart(8, "123")); // "12312315"
5. 注意事项
padString
如果过长,会被截断以适应目标长度。- 如果
targetLength
小于或等于原字符串长度,返回原字符串。
九、总结
isWellFormed()
:检查字符串是否是格式良好的Unicode字符串。lastIndexOf()
:查找子字符串最后一次出现的位置。localeCompare()
:根据语言环境,对字符串进行比较和排序。match()
:根据正则表达式,检索字符串中的匹配项。matchAll()
:获取所有匹配结果的迭代器,包括捕获组。normalize()
:将字符串正规化为指定的Unicode形式。padEnd()
:在字符串末尾填充指定字符串,达到目标长度。padStart()
:在字符串开头填充指定字符串,达到目标长度。
十、参考资料
- MDN Web Docs - String
- MDN Web Docs - String.prototype.isWellFormed()
- MDN Web Docs - String.prototype.lastIndexOf()
- MDN Web Docs - String.prototype.localeCompare()
- MDN Web Docs - String.prototype.match()
- MDN Web Docs - String.prototype.matchAll()
- MDN Web Docs - String.prototype.normalize()
- MDN Web Docs - String.prototype.padEnd()
- MDN Web Docs - String.prototype.padStart()