语法的扩展
ES6 对语法进行了大量扩展,包括且不限于字符串、正则、数值、函数、数组、对象的扩展等,此篇总结 ES6 新增的一些常用的新语法,一起来学习新姿势。
字符串的扩展
ES6 加强了对 Unicode 的支持,并且扩展了字符串对象。
Unicode 表示法
JavaScript 内部,字符以 UTF-16 的格式储存,每个字符固定为 2 个字节。但只限于码点在 u0000~uFFFF
之间的字符。对于 Unicode 码点大于 0xFFFF 的字符,需要 2 个字符,也就是 4 个字节存储。
同时如果在 u 后面码点大于 0xFFFF,需要加上花括号才能正确显示,如 u{20BB7}
。
// 大括号表示法与 UTF-16 等价
'u{1F680}' === 'uD83DuDE80'
有了这种表示法之后,JavaScript 共有 6 种方法可以表示一个字符。
代码语言:javascript复制'z' === 'z' // true
'172' === 'z' // true
'x7A' === 'z' // true
'u007A' === 'z' // true
'u{7A}' === 'z' // true
codePointAt() 和 fromCodePoint()
对于 4 个字节的字符,JavaScript 不能正确处理,字符串长度会被误判为 2,而且 charAt 方法无法读取整个字符,charCodeAt 方法只能分别返回前 2 个字节和后 2 个字节的值。
ES6 提供了 codePointAt 方法,能够正确处理 4 个字节储存的字符,返回一个字符的码点。
codePointAt 方法是测试一个字符是由 2 个字节还是 4 个字节组成的最简单方法。
代码语言:javascript复制function is32Bit(c) {
return c.codePointAt(0) > 0xffff
}
于此同时,ES6 提供了 String.fromCodePoint 方法,作用同 codePointAt 相反,新方法可以识别大于 0xFFFF 的字符,弥补了 String.fromCharCode 方法的不足。
代码语言:javascript复制String.fromCodePoint(0x20bb7)
String.fromCodePoint(0x78, 0x1f680, 0x79) === 'xuD83DuDE80y' // true
上面的代码中,如果 String.fromCharCode 方法有多个参数,则它们会被合并成一个字符串返回。
注意:fromCodePoint 方法定义在 String 对象上,而 codePointAt 方法定义在字符串的实例对象上。
遍历器接口
ES6 为字符串添加了遍历器接口,使得字符串可以由 for…of 循环遍历。同时,遍历器的最大优点是可以识别大于 0xFFFF 的码点,传统的 for 循环无法识别这样的码点。
代码语言:javascript复制var text = String.fromCodePoint(0x20bb7)
for (let i of text) {
console.log(i) // '