JavaScript資料結構思考(字串篇)

語言: CN / TW / HK

寫在前面

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,具體還要看 與實際值相關的實現。