[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
```