JavaScript資料結構思考(字串篇)
寫在前面
String是字串對應的引用型別。String型別提供了很多方法來解析和操作字串。
JavaScript字元
JavaScript字串由16位碼元(code unit)組成。對多數字符來說,每16位碼元對應一個字元。 - length屬性:字串的屬性表示字串包含多少16位碼元 - charAt()方法:返回給定索引位置的字元,由傳給方法的整數引數指定。
js
let message = 'abcdef'
console.log(message.charAt(2)) // 'c'
JavaScript字串使用了兩種Unicode編碼混合策略:UCS-2和UTF-16。對於可以採用16位編碼的字元(U+0000~FFFF),這兩種編碼實際上是一樣的。 - charCodeAt()方法:檢視指定碼元的字元編碼。返回指定索引位置的碼元值,索引以整數指定。一般是ASCII碼
js
let message = 'abcdef'
console.log(message.charCodeAt(2)) // '99'
- fromCharCode()方法:用於根據給定的UTF-16碼元建立字串中的字元。這個方法可以接受任意多個數值,並返回將所有數值對應的字串拼接起來的字串。
js
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()方法
這個方法接收一個整數引數,表示要將字 符串複製多少次,然後返回拼接所有副本後的結果
js
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)
```js 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 迴圈中可以通過這個迭代器按序訪問每個字元。
js
for (const c of "abcde") {
console.log(c);
}
有了這個迭代器之後,字串就可以通過解構操作符來解構了。
js
let message = "abcde";
console.log([...message]); // ["a", "b", "c", "d", "e"]
字串大小寫轉換
包括 4 個方法:toLowerCase()、toLocaleLowerCase()、toUpperCase()和toLocaleUpperCase()。
字串模式匹配方法
- match()方法:本質上跟RegExp物件的exec()方法相同。 引數: 正則表示式字串或者一個RegExp物件。 返回值:陣列
```js 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
js
let text = "cat, bat, sat, fat";
let pos = text.search(/at/);
console.log(pos); // 1
- replace()方法: 字串替換 引數: 第一個引數:正則表示式字串或者一個RegExp物件。第二個引數可以是一個字串或一個函式。 返回值:替換後的字串
```js 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,具體還要看 與實際值相關的實現。