> ES6加强了对Unicode的支持,并扩展了字符串对象
### 字符的Unicode表示法
JavaScript允许采用 `\uxxxx` 形式表示一个字符,其中 xxxx 表示字符的 Unicode 码点
```js
"\u0061"
// 'a'
```
但这种表示法只限于码点在 `\u0000` ~ `\uFFFF`之间的字符,超出这个范围的字符就必须用2个双字节的形式表达。ES6对这一点做出了改进,只要把码点放入大括号,就能正确解读该字符
```js
"\u{20BB7}"
```
### codePointAt()
ES6提供了 `codePointAt` 方法,能正确处理4个字符串存储的字符,返回一个字符的码点
```js
let s = '中'
s.codePointAt() // 20013
```
`codePointAt` 方法返回的是码点的十进制,如果想要二进制,可以使用 `toString` 转换一下
```js
s.codePointAt().toString(16) // "4e2d"
"\u4e2d" // '中'
```
### String.fromCodePoint()
ES5提供了 `String.fromCharCode` 方法,用于从码点返回对应字符,但这个方法不能识别32位的UTF-16字符。ES6提供了 `String.fromCodePoint` 方法以弥补这个不足。
```js
String.fromCodePoint(0x4e2d)
// '中'
```
### 字符串的遍历器接口
ES6为字符串添加了遍历器接口,使得字符串可以由 `for...of` 循环遍历。
```js
for (let codePoint of 'foo') {
console.log(codePint)
}
// 'f'
// 'o'
// 'o'
```
### at()
ES5提供了字符串对象的 `charAt` 方法,返回字符串给定位置的字符。该方法不能识别码点大于 `0xFFFF` 的字符。
目前有一个提案是增加字符串实例的 `at` 方法,可以识别码点大于 `0xFFFF` 的字符。
### normalize()
ES6为字符串提供了 `normalize` 方法,用来将字符的不同表示方法统一为同样的形式,这被称为Unicode正规化。
### includes()、startsWith()、endsWith()
ES5中,只有 `indexOf` 方法用来确定一个字符串是否包含在另一个字符串中,ES6提供了3个方法:
- `includes()` 返回布尔值,表示是否找到了参数字符串
- `startsWith()` 返回布尔值,表示参数字符串是否在源字符串的头部
- `endsWith()` 返回布尔值,表示参数字符串是否在源字符串的尾部
```js
let s = 'Hello world!'
s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
```
该方法还支持第二个参数,表示开始搜索的位置
```js
let s = 'Hello World!'
s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false
```
### repeat()
`repeat` 方法返回一个新字符串,表示将源字符串重复 n 次
```js
'x'.repeat(3) // xxx
'hello'.repeat(2) // hellohello
'na'.repeat(0) // ''
```
### padStart()、padEnd()
ES2017引入了字符串补全长度的功能,如果某个字符串不够指定长度,会在头部或尾部补全。
```js
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // xabab
'x'.padEnd(4, 'ab') // xaba
```
### 模板字符串
ES6引入了模板字符串来解决定义过长字符串的问题。模板字符串是增强版的字符串,用反引号(`)标识,它可以当做普通字符串使用,也可以用来定义多行字符串,或者在字符串中插入变量。
```js
// 普通字符串
`In JavaScript '\n' is a line-feed`
// 多行字符串
`In JavaScript this is
not legal.`
console.log(`string text line 1
string text line 2`)
// 字符串中插入变量
let name = 'Bob', time = 'today'
`Hello ${name}, how are you ${time}`
```
**注意**:如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出中
可以用是 `trim()` 方法消除换行,在模板字符串中嵌入变量,需要将变量名写在 `${}` 中。
模板字符串中还可以调用函数
```js
function fn () {
return 'hello world'
}
`foo ${ fn() } bar`
// foo hello world bar
```
### 标签模板
模板字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为 `标签模板` 功能
```js
alert`123`
// alert(123)
```
### String.raw()
ES6为原生String对象提供了 `raw` 方法,该方法用来充当模板字符串的处理函数,返回一个反斜线都被转义的字符串,对应于替换变量后的模板字符串
```js
String.raw`Hi\n${2+3}`
// 'Hi\\n5'
```