[toc]
### 更好的Unicode支持
早期,由于存儲空間寶貴,Unicode使用16位二進制來存儲文字(相當于2^16=65536個文字)。此時我們將一個16位的二進制編碼稱為一個碼元(code?Unit)。
后來,由于技術的發展,Unicode對文字編碼進行了擴展,將某些文字擴展到了32位(一個文字占用兩個碼元,相當于2^32約為40多億的文字)。并且,將這類文字對應的二進制數字叫做碼點(code?point)。
ES6之前,正常情況下字符串的legnth屬性是按照碼元來計算的,所以當遇到擴展為32位的文字時,明明是一個文字,但是length屬性返回的卻是2就是這個原因。charCodeAt方法也是按碼元來計算的,遇到32位文字時會返回charCodeAt(0)和charCodeAt(1)兩個值。
ES6為了解決這個問題,新出了一個方法codePointAt(),可以直接按照碼點來返回文字的編碼值。
```js
text.codePointAt(0) //可以返回該字符的碼點
text.codePointAt(1) //如果是32位的字符,返回第二位的碼元
```
該方法可以用來判斷給出的字符是否為32位字符
```js
function is32Bit(str){
returnstr.codePointAt(0)?> 0xffff;
}
//返回true即為32位字符,false即是16位字符
```
同時,為解決正則表達式匹配32位字符的問題,ES6為正則表達式提供了一個flag:u。當加上u來匹配時,正則表達式按照碼點來匹配。
### 更多的字符串API
以下方法均為字符串的實例(原型上的)方法
#### includes方法
判斷字符串中是否包含指定的子字符串,返回布爾值
```js
const str = 'abcdefg';
let res = str.includes('c',?2) //res值為true
let res = str.includes('c',?4) //res值為false
//第一個參數用來表示要查找的指定字符,第二個參數為一個下標值,用來指定從字符串的第幾個位置開始向后查找。
```
#### startsWith方法
判斷字符串是否以指定的字符串開始,返回布爾值。該方法的第二個參同includes,用來指定起始位置。
#### endsWith方法
判斷字符串是否以指定的字符串結束,返回布爾值。該方法的第二個參同includes,用來指定起始位置。
#### repeat方法
將字符串重復指定的次數,返回一個新的字符串
```js
let str = 'abc';
let newstr = str.repeat(3); //newstr的值為'abcabcabc'
```
#### [擴展\]正則中的粘連標記
標記名為:y
具體含意:當正則表達式加上標記y的時候,匹配時完全按照正則對象中的lastIndex位置開始匹配。并且匹配的位置必須在lastIndex位置。
正則表達式的lastIndex屬性默認為0,但可以更改,例如:
```js
const str = 'hello?World';
const reg =?/W\\w+/; //當前正則表達式表示匹配第一個字符為W后面字符長度任意的單詞
reg.test(str); //此時可以匹配World這個單詞,所以返回true
const reg1 =?/W\w+/y; //新建一個正則reg1,此時加上粘連標記y
reg1.test(str); //因為加了y,正則要從lastIndex的位置開始匹配。此時的lastIndex為0,正則會從h開始匹配第一個字母是否為W。因為第一個單詞為hello,所以無法匹配,返回false
reg1.lastIndex = 6; //正則表達式的lastIndex屬性是可以更改的,當lastIndex改為6時,匹配的起始位置從W開始。
reg1.test(str); //此時第一個字母為W,單詞可以匹配,返回true
```
> 加了粘連標記相當于指定了正則表達式從字符串的第幾個下標位置進行匹配。若當lastIndex指定的位置無法匹配,其也不會繼續向后匹配,直接返回false。
### 模板字符串
#### 模板字符串書寫
在ES6中提供了模板字符串的書寫格式,可以非常方便的進行書寫和拼接。定義時只需將雙引號改為反單引號(`)即可。
```js
let str = `aaaaa
bbbbb`;
console.log(str);
//輸出的結果為:
//aaaaa
//bbbbb
//即在反單引號中怎樣書寫格式,輸出也是相同的格式。
```
>模板字符串中可以插入轉義字符,如\\n插入換行。如果需要在模板字符串中插入特殊字符,就在該字符前加\\。
#### 模板字符串的拼接
若要在模板字符串中拼接JS表達式,只需在模板字符串中插入${JS表達式}
```js
let value = 'hello';
let str = `aaa${value}bbb`; //str的輸出結果為:'aaahellobbb'?
```
>${}中可以插入任何JS表達式或變量,也可以插入新的模板字符串,但不能插入JS語句。
#### [擴展\]模板字符串標記
定義模板字符串時,可以在模板字符串前加上模板字符串標記。該標記為一個函數(函數名可自定義),可以將模板字符串以${}為分隔符進行拆分。具體方法如下:
```js
let value1 = 'football';
let value2 = 'run';
let str = myTag`I?like?${value1},?I?like?${value2}!`; //myTag就是定義的模板字符串標記,其規則可以自定義。
function myTag(part){
console.log(part); //part變量返回的是把模板字符串按${}拆分后的數組,\['I?like',',?I?like','!'\]
//同時可以在part后面增加參數或通過arguments返回每個${}中的值。
}
```
>通過模板字符串標記可以按照需求來操作模板字符串中的內容。
String.raw函數,是系統原生函數。可以將模板字符串中的所以轉義字符取消轉義,原樣輸出。
```js
let str = `aaa\\nbbb`;
//正常情況下輸出:
//aaa
//bbb
let str = String.raw`aaa\\nbbb`;
//此時輸出:
//aaa\\nbbb
```