JS不再百度系列-字串的基本操作
這篇記錄的是我常用的字串操作。本文全部內容來自MDN。 完整的可以看這個
注意:
- js的所有字串方法均不會修改原字串
String.prototype和Array.prototype中都有的方法
concat
返回值:新的拼接好的字串
eg:
a = "a" a.concat([1,2])//"a1,2" a.concat(1,true,null, undefined)//a1truenullundefined,各元素會先用String()處理轉化成字串複製程式碼
includes
語法:
str.includes(searchString[, position])
引數:
- searchString:要在此字串中搜索的字串(可以是字串,不一定是單個字元。indexOf和lastIndexOf同) ,如果不是字串,會先用String()轉為字串,此點和Array中的includes的表現不一樣
- position:可選。從當前字串的哪個索引位置開始搜尋子字串,預設值為0。不支援負數,若是負數則無意義,指定為負數等同於指定為0
eg:
a = ["1", "2", "3"] a.includes(1)//false b = "123" b.includes(1)//true a.includes("2", -1)//false a.includes("2", -2)//true b.includes("2", -1)//true b.includes("2", -2)//true b.includes("2", 1)//true b.includes("2", 2)//false 複製程式碼
indexOf
用法基本和陣列中的indexOf一樣,支援兩個引數。
第二個引數不支援負數,或者說當第二個引數是負數時,表現會比較複雜。但我個人認為這沒有記憶的必要
如果fromIndex < 0
則查詢整個字串(如同傳進了 0
)。如果fromIndex >= str.length
,則該方法返回 -1。當被查詢的字串是一個空字串,fromIndex <= 0
時返回0
,0 < fromIndex <= str.length
時返回fromIndex
,fromIndex > str.length
時返回str.length
。
lastIndexOf
第二個引數同樣不支援負數。如果為負值,則被看作 0。如果fromIndex > str.length
,則fromIndex
被看作str.length
總結:
個人覺得,使用String.prototype.includes/indexOf/lastIndexOf時,如果需要用到第二個引數,記得用正數表示就好,沒必要使用負數,得不償失
slice
語法和引數完全同Array,第二個引數同樣支援負數
字元相關操作
charAt
定義:從一個字串中返回指定位置的字元
返回值:一個字元
語法:
str.charAt(index = 0)
引數:
- index:一個介於0 和字串長度減1之間的整數。 (0~length-1),預設為0。如果超過length-1,返回空字元;
charCodeAt
定義:方法返回0到65535之間的整數,表示給定索引處的UTF-16程式碼單元 (在 Unicode 編碼單元表示一個單一的 UTF-16 編碼單元的情況下,UTF-16 編碼單元匹配 Unicode 編碼單元。但在——例如 Unicode 編碼單元 > 0x10000 的這種——不能被一個 UTF-16 編碼單元單獨表示的情況下,只能匹配 Unicode 代理對的第一個編碼單元)
以我的理解,UTF-16編碼方式固定以兩個位元組表示一個字元,兩個位元組即上文說的UTF-16編碼單元。charCodeAt返回表示指定字元UTF-16編碼單元的整數。但總有超出兩個位元組表示的字元,譬如有些字元需要四個位元組表示,這時charCodeAt就返回第一個編碼單元,即四個位元組中的前兩個位元組
具體建議閱讀阮一峰老師的:ES6入門
語法:
str.charCodeAt(index)
引數:
-
index,
一個大於等於 0,小於字串長度的整數 。如果不是一個數值,則預設為 0
返回值:表示給定索引處(String中index索引處)字元的 UTF-16 程式碼單元值的數字(Number)
;如果索引超出範圍,則返回NaN
codePointAt
定義:方法返回 一個 Unicode 編碼點值的非負整數(可以識別大於雙位元組儲存的字元)
返回值:表示Unicode編碼點值的非負整數
擷取操作
slice
參考上面
substr
先搬一下來自MDN的警告
警告: 儘管
String.prototype.substr(…)
沒有嚴格被廢棄 (as in "removed from the Web standards"), 但它被認作是遺留的函式並且可以的話應該避免使用。它並非JavaScript核心語言的一部分,未來將可能會被移除掉。如果可以的話,使用
substring()
替代它.
鑑於此,直接跳過至substring
substring
定義:返回一個字串在開始索引到結束索引之間的一個子集(新的字串,包括開始索引不包括結束索引) , 或從開始索引直到字串的末尾(若省略第二個引數)的 一個子集
返回值:包含給定字串的指定部分的新字串
語法:
str.substring(indexStart[, indexEnd])複製程式碼
引數
- indexStart。需要擷取的第一個字元的索引,該字元作為返回的字串的首字母。
- indexEnd。可選。一個 0 到字串長度之間的整數(不支援負數 ,若是負數,返回空串) ,預設是str.length 。以該數字為索引的字元不包含在擷取的字串內。若是substr,該引數指定了要擷取字元數
split 指定
支援正則的方法
match 檢索字串
定義:檢索返回一個字串匹配正則表示式的的結果
返回值:
語法:str.match(regexp)
引數:
- regexp
一個正則表示式物件。如果傳入一個非正則表示式物件,則會隱式地使用new RegExp(obj)
將其轉換為一個
RegExp
。如果你沒有給出任何引數並直接使用match() 方法 ,你將會得到一 個包含空字串的
Array
:[""] 。
返回值:
Array
),但不會返回捕獲組,或者未匹配返回 null
。Array
)( 關聯陣列 )
。 在這種情況下,返回的專案將具有如下所述的附加屬性
,或者未匹配返回 null
。附加屬性
如上所述,匹配的結果包含如下所述的附加特性。
-
groups
: 一個捕獲組陣列 或undefined
(如果沒有定義命名捕獲組)。 -
index
: 匹配的結果的開始位置 -
input
: 搜尋的字串.
eg:
a = "12311"; a.match(/1/g);//["1", "1", "1"],不會返回捕獲組 a.match(/8/g); a.match(/1/);//["1", index: 0, input: "12311", groups: undefined] a.match(/8/);//null 複製程式碼
總結一下返回值有三種情況:
- null,未匹配到
- 該字串所有匹配正則表示式的結果組成的陣列,可通過其得知字串有多個個能匹配正則的子串,正則表示式有g標誌的情況下
- 具有附加屬性的捕獲組(一個關聯陣列)
search 檢索字串
定義:執行正則表示式和
String
物件之間的一個搜尋匹配
語法:str.search(regexp)
引數:
- regexp
返回值:如果匹配成功,則search()
返回正則表示式在字串中首次匹配項的索引;否則,返回-1
感覺像是支援正則的indexOf,不闡述更多
replace 替換
這個應用場景比較多