字符串
- 引号:单引号和双引号基本相同。反引号(模板字面量):允许字符串跨越多行并可以使用 ${…} 在字符串中嵌入表达式。
- 编码:JavaScript 中的字符串使用的是 UTF-16 编码。
- 字符串长度:str.length 是一个属性,不是一个函数
- 访问字符:获取字符时,使用 []
- str[index]:是把字符串当作一个类似数组的对象,其中的每个字符对应一个数值索引。使用括号访问字符串不可以对其进行删除或添加,因为字符串对应未知的属性并不是可读或配置的。
- 第一个字符从零位置开始
- 最后一个字符:str[str.length - 1]
- str.charAt(index)。方括号是获取字符的一种现代化方法,而 charAt 是历史原因才存在的。它们之间的唯一区别是,如果没有找到字符,[] 返回 undefined,而 charAt 返回一个空字符串。
for (let char of "Hello") {
alert(char); // H,e,l,l,o(char 变为 "H",然后是 "e",然后是 "l" 等)
}
查找子字符串
- 在 JavaScript 中,字符串不可更改。改变字符是不可能的。通常的解决方法是创建一个新的字符串,并将其分配给 str 而不是以前的字符串。
- 改变大小写:toLowerCase() 和 toUpperCase()
- 查找子字符串:
- str.indexOf(substr, start):检查某一子字符串在父字符串中的位置。从给定位置 start 开始,在 str 中查找 substr,如果没有找到,则返回 -1,否则返回匹配成功的位置。因为位置可能是0,所以判断的死后,用 != -1 判断。
- str.lastIndexOf(substr, position):从字符串的末尾开始搜索到开头。
- str.includes(substr, start):根据 str 中是否包含 substr 来返回 true/false。检测匹配,但不需要它的位置,这是正确的选择。
- 方法 str.startsWith(substr) 和 str.endsWith(substr) 的功能与其名称所表示的意思相同。
获取子字符串
- 获取子字符串:JavaScript 中有三种获取字符串的方法:substring、substr 和 slice。
- str.slice(start, end):从 start 到 end(不含 end)。如果没有第二个参数,slice 会一直运行到字符串末尾。start/end 都可以是负值。它们的意思是起始位置从字符串结尾计算。
- str.substring(start, end):start 与 end 之间(包括 start,但不包括 end)。这与 slice 几乎相同,但它允许 start 大于 end。位置互换,不影响结果。不支持负参数(不像 slice),负值代表 0。
- str.substr(start, length):从 start 开始获取长为 length 的字符串。允许 start 为负数,从结尾算起。
- 它们可以完成这项工作。形式上,substr 有一个小缺点:它不是在 JavaScript 核心规范中描述的,而是在附录 B 中,它涵盖了主要由于历史原因而存在的仅浏览器特性。因此,非浏览器环境可能无法支持它。但实际上它在任何地方都有效。相较于其他两个变体,slice 稍微灵活一些,它允许以负值作为参数并且写法更简短。因此仅仅记住这三种方法中的 slice 就足够了。
- str.trim() —— 删除字符串前后的空格 (“trims”)。
- str.repeat(n) —— 重复字符串 n 次。
长字符串
- String:全局对象是一个用于字符串或一个字符序列的构造函数。使用 String 函数将其他值生成或转换成字符串。
- String(thing)
- new String(thing):通过 new 生成字符串对象实例。
- 参数 thing 任何可以被转换成字符串的值。
- 长字符串:有时,你的代码可能含有很长的字符串。你可能想将这样的字符串写成多行,而不是让这一行无限延长或着被编辑器折叠。有两种方法可以做到这一点。
let longString = "This is a very long string which needs " +
"to wrap across multiple lines because " +
"otherwise my code is unreadable.";
- 其二,可以在每行末尾使用反斜杠字符(“\”),以指示字符串将在下一行继续。确保反斜杠后面没有空格或任何除换行符之外的字符或缩进; 否则反斜杠将不会工作。
let longString = "This is a very long string which needs \
to wrap across multiple lines because \
otherwise my code is unreadable.";
- 其三,反引号(模板字面量):允许字符串跨越多行并可以使用 ${…} 在字符串中嵌入表达式。
正则表达式
- str.match(regexp):方法在字符串 str 中找到匹配 regexp 的字符。
- 它有 3 种模式:
- 如果 regexp 不带有 g 标记,则它以数组的形式返回第一个匹配项,其中包含分组和属性 index(匹配项的位置)、input(输入字符串,等于 str):
- 如果 regexp 带有 g 标记,则它将所有匹配项的数组作为字符串返回,而不包含分组和其他详细信息。
- 如果没有匹配项,则无论是否带有标记 g ,都将返回 null。
- str.matchAll(regexp):是 str.match “新改进的”变体。是一个最近添加到 JavaScript 的特性。 旧式浏览器可能需要 polyfills。它主要用来搜索所有组的所有匹配项。与 match 相比有 3 个区别:
- 它返回包含匹配项的可迭代对象,而不是数组。我们可以用 Array.from 从中得到一个常规数组。如果我们用 for..of 来循环 matchAll 的匹配项,那么我们就不需要 Array.from 了。
- 每个匹配项均以包含分组的数组形式返回(返回格式与不带 g 标记的 str.match 相同)。
- 如果没有结果,则返回的不是 null,而是一个空的可迭代对象。
- str.split(regexp|substr, limit):使用正则表达式(或子字符串)作为分隔符来分割字符串。
- str.search(regexp):方法返回第一个匹配项的位置,如果未找到,则返回 -1。重要限制:search 仅查找第一个匹配项。如果需要其他匹配项的位置,则应使用其他方法,例如用 str.matchAll(regexp) 查找所有位置。
- str.replace(str|regexp, str|func):这是用于搜索和替换的通用方法,是最有用的方法之一。它是搜索和替换字符串的瑞士军刀。不过有一个陷阱。当 replace 的第一个参数是字符串时,它仅替换第一个匹配项。要找到所有的字符,应使用带 g 标记的正则表达式 //g。
- regexp.exec(str):方法返回字符串 str 中的 regexp 匹配项。与以前的方法不同,它是在正则表达式而不是字符串上调用的。
- 如果没有 g,那么 regexp.exec(str) 返回的第一个匹配与 str.match(regexp) 完全相同。这没什么新的变化。
- 如果有标记 g,
- 调用 regexp.exec(str) 会返回第一个匹配项,并将紧随其后的位置保存在属性 regexp.lastIndex 中。
- 下一次同样的调用会从位置 regexp.lastIndex 开始搜索,返回下一个匹配项,并将其后的位置保存在 regexp.lastIndex 中。
- …以此类推。
- 如果没有匹配项,则 regexp.exec 返回 null,并将 regexp.lastIndex 重置为 0。
- 因此,重复调用会挨个返回所有的匹配项,属性 regexp.lastIndex 用来跟踪当前的搜索位置。过去,在将 str.matchAll 方法添加到 JavaScript 之前,在循环中是通过调用 regexp.exec 来获取分组的所有匹配项。这个现在也可以使用,尽管对于较新的浏览器来说,str.matchAll 通常更方便。
- regexp.test(str):方法查找匹配项,然后返回 true/false 表示是否存在。
- 如果正则表达式带有标记 g,则 regexp.test 从 regexp.lastIndex 属性中查找,并更新此属性,就像 regexp.exec 一样。
- 相同的全局正则表达式在不同的源字符串上测试可能会失败。如果我们在不同的源字符串上应用相同的全局表达式,可能会出现错误的结果,因为 regexp.test 的调用会增加 regexp.lastIndex 属性值,因此在另一个字符串中的搜索可能是从非 0 位置开始的。
let regexp = /javascript/g; // (新建 regexp:regexp.lastIndex=0)
alert( regexp.test("javascript") ); // true(现在 regexp.lastIndex=10)
alert( regexp.test("javascript") ); // false
这正是因为在第二个测试中 regexp.lastIndex 不为零。如要解决这个问题,我们可以在每次搜索之前设置 regexp.lastIndex = 0。或者,不调用正则表达式的方法,而是使用字符串方法 str.match/search/...,这些方法不用 lastIndex。