写在前面
String是字符串对应的引用类型。String类型提供了很多方法来解析和操作字符串。
JavaScript字符
JavaScript字符串由16位码元(code unit)组成。对多数字符来说,每16位码元对应一个字符。
- length属性:字符串的属性表示字符串包含多少16位码元
- charAt()方法:返回给定索引位置的字符,由传给方法的整数参数指定。
let message = 'abcdef'
console.log(message.charAt(2)) // 'c'
JavaScript字符串使用了两种Unicode编码混合策略:UCS-2和UTF-16。对于可以采用16位编码的字符(U+0000~FFFF),这两种编码实际上是一样的。
- charCodeAt()方法:查看指定码元的字符编码。返回指定索引位置的码元值,索引以整数指定。一般是ASCII码
let message = 'abcdef'
console.log(message.charCodeAt(2)) // '99'
- fromCharCode()方法:用于根据给定的UTF-16码元创建字符串中的字符。这个方法可以接受任意多个数值,并返回将所有数值对应的字符串拼接起来的字符串。
console.log(String.fromCharCode(0x61, 0x62, 0x63, 0x64, 0x65)); // "abcde"
console.log(String.fromCharCode(97, 98, 99, 100, 101)); // "abcde"
字符串操作方法
拼接方法
- concat()方法:用于将一个或多个字符串拼接成一个新字符串。
提取子字符串方法
- slice()方法
- substr()方法
- substring()方法
参数:第一个参数表示子字符串开始的位置。第二个参数对于slice()和 substring()而言,是提取结 束的位置(即该位置之前的字符会被提取出来);对 substr()而言,第二个参数表示返回的子字符串数量。
位置方法
- indexOf()
- lastIndexOf() 这两个方法从字符串中搜索传入的字符串,并返回位置(如果没找到,则返回-1)。
参数:第一个参数表示要找到的字符;第二个参数表示指定开始搜索的位置。
包含方法
这些方法都会从字符串中搜索传入的字符串,并返回一个表示是否包含的布尔值。
- startsWith():检查开始于索引0的匹配项
- endsWith(): 检查开始于(string.length - substring.length)的匹配项
- includes():检查整个字符串
startsWith() 和 includes()方法接收可选的第二个参数,表示开始搜索的位置。如果传入第二个参数,则意味着这两个方法会从指定位置向着字符串末尾搜索,忽略该位置之前的所有字符。
endsWith()方法接收可选的第二个参数,表示应该当作字符串末尾的位置。如果不提供这个参数,那么默认就是字符串长度
trim()方法
这个方法会创建字符串的一个副本,删除前、 后所有空格符,再返回结果
repeat()方法
这个方法接收一个整数参数,表示要将字 符串复制多少次,然后返回拼接所有副本后的结果
let stringValue = "na ";
console.log(stringValue.repeat(16) + "batman"); // na na na na na na na na na na na na na na na na batman
padStart()和 padEnd()
padStart()和 padEnd()方法会复制字符串,如果小于指定长度,则在相应一边填充字符,直至满足长度条件。
参数:第一个参数是长度,第二个参数是可选的填充字符串,默认为空格 (U+0020)
let stringValue = "foo";
console.log(stringValue.padStart(6)); // " foo"
console.log(stringValue.padStart(9, ".")); // "......foo"
console.log(stringValue.padEnd(6)); // "foo "
console.log(stringValue.padEnd(9, ".")); // "foo......"
字符串迭代与解构
字符串的原型上暴露了一个@@iterator 方法,表示可以迭代字符串的每个字符。
在 for-of 循环中可以通过这个迭代器按序访问每个字符。
for (const c of "abcde") {
console.log(c);
}
有了这个迭代器之后,字符串就可以通过解构操作符来解构了。
let message = "abcde";
console.log([...message]); // ["a", "b", "c", "d", "e"]
字符串大小写转换
包括 4 个方法:toLowerCase()、toLocaleLowerCase()、toUpperCase()和toLocaleUpperCase()。
字符串模式匹配方法
- match()方法:本质上跟RegExp对象的exec()方法相同。 参数: 正则表达式字符串或者一个RegExp对象。 返回值:数组
let text = "cat, bat, sat, fat";
let pattern = /.at/;
// 等价于 pattern.exec(text)
let matches = text.match(pattern);
console.log(matches.index); // 0
console.log(matches[0]); // "cat"
console.log(pattern.lastIndex); // 0
console.log(matches) // [ 'cat', index: 0, input: 'cat, bat, sat, fat', groups: undefined ]
- search() 参数: 正则表达式字符串或者一个RegExp对象。 返回值:第一个匹配的位置索引,如果没找到则返回-1
let text = "cat, bat, sat, fat";
let pos = text.search(/at/);
console.log(pos); // 1
- replace()方法: 字符串替换 参数: 第一个参数:正则表达式字符串或者一个RegExp对象。第二个参数可以是一个字符串或一个函数。 返回值:替换后的字符串
let text = "cat, bat, sat, fat";
let result = text.replace("at", "ond");
console.log(result); // "cond, bat, sat, fat"
result = text.replace(/at/g, "ond");
console.log(result); // "cond, bond, sond, fond"
localeCompare()方法
这个方法比较两个字符串,返回如下 3 个值中的一个
- 如果按照字母表顺序,字符串应该排在字符串参数前头,则返回负值。(通常是-1,具体还要看 与实际值相关的实现。)
- 如果字符串与字符串参数相等,则返回 0。 - 如果按照字母表顺序,字符串应该排在字符串参数后头,则返回正值。(通常是 1,具体还要看 与实际值相关的实现。