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