JavaScript数据结构思考(字符串篇)

481 阅读4分钟

写在前面

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,具体还要看 与实际值相关的实现。