ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
> 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' ```