天天看点

io.js入门(三)—— 所支持的ES6(下)

(接上篇)

标准ES6特性

6. 新的String方法/New String methods

7. 符号/Symbols

8. 字符串模板/Template strings

io.js入门(三)—— 所支持的ES6(下)

新的String方法/New String methods

codePointAt() 和  String.fromCodePoint()

JS内部是以UTF-16的形式(每个字符长度都固定为16位元、2个字节)来存储字符编码的。就汉字来说,大部分的汉字均以2字节的形式来存储即可,却也有部分汉字需要有4个字节的长度来存储(其codePoint/码点大于0xFFFF),比如这个生僻字“𠮷”(注意不是“吉”),其Unicode码点是0x20BB7(十进制为134071),UTF-16码点为0xD842 0xDFB7(十进制为55362 57271)。

我们如果对这种字符使用常规的 charAt(0) 和 String.fromCharCode() ,将无法获得正确的码点/字符:

为解决此问题,ES6推出了 codePointAt() 和  String.fromCodePoint() 这两个字符串方法,前者可以顺利获取字符的Unicode码点,后者可由已知码点获得对应字符:

该方法的测试比较麻烦,因为常规是命令行界面是GBK编码的,即使使用“chcp 65001”口令切到UTF-8形式也无法正常显示上文提到的生僻字符。不过我们可以将代码转到浏览器(别用IE)上显示:

io.js入门(三)—— 所支持的ES6(下)
io.js入门(三)—— 所支持的ES6(下)

View Code

接着我们访问地址 http://127.0.0.1:1337/  可看到如下内容:

io.js入门(三)—— 所支持的ES6(下)
io.js入门(三)—— 所支持的ES6(下)

startsWith(),endsWith() 和 includes()

常规我们会使用 s.indexOf() 来检测一个字符串里是否含有某段字符串。ES6提供了3个新的字符串检索方法,其中 startsWith() 和 endsWith() 分别用于从头部/尾部开始匹配字符串片段,includes()则没有位置限定,它们都返回boolean值。这三个方法都很好理解,直接上例子吧:

这三个方法均支持第二个参数,表示开始搜索的位置:

注意endsWith()加上第二个参数后,表示匹配从开始到参数索引位置结束的字符串。

io.js入门(三)—— 所支持的ES6(下)

repeat()

repeat()返回一个新字符串,表示将原字符串重复n次:

io.js入门(三)—— 所支持的ES6(下)

normalize()

该方法可将所给字符串转化为Unicode标准化字符:

这里有个有趣的例子——为了表示语调和重音符号,Unicode提供了两种方法。一种是直接提供带重音符号的字符,比如Ǒ(\u01D1)。另一种是提供合成符号(combining character),即原字符与重音符号的合成,两个字符合成一个字符,比如O(\u004F)和ˇ(\u030C)合成Ǒ(\u004F\u030C)。

这两种表示方法,在视觉和语义上都等价,但是JavaScript不能识别:

上面代码表示,JavaScript将合成字符视为两个字符,导致两种表示方法不相等。使用normalize()方法可以解决该问题:

normalize方法可以接受四个参数:

   NFC,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。

   NFD,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。

   NFKC,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”(当然这里只是举例子,normalize只适用于欧洲文字,解决法语的重音符号之类的问题)。

   NFKD,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。

io.js入门(三)—— 所支持的ES6(下)

符号/Symbols

ES6引入了一种新的原始数据类型Symbol,表示独一无二的ID。它通过Symbol函数生成:

Symbol函数可以接受一个字符串作为参数,表示Symbol实例的名称。需要注意的是Symbol实例均是独一无二、不相等的:

注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。如果你的确想生成一个Symbol包装对象,应使用Object() 方法:

常规我们把Symbol实例作为某个对象的属性名字,因为它是独一无二的,可以有效防止对象属性被污染:

另一个需要了解的是Symbol实例作为对象属性是不可被枚举的,但我们可以通过 Object.getOwnPropertySymbols() 来获取它们:

除了常规创建独一无二的Symbol实例,我们也可以通过 Symbol.for() 来创建可共享的Symbol实例。通过Symbol.for()创建的Symbol实例,我们可以使用 Symbol.keyFor() 获取它的键名:

Symbol除了可作为对象的某个独一无二的、不可枚举的属性,还有一个用处是可用于描述:

io.js入门(三)—— 所支持的ES6(下)

字符串模板/Template strings

模板字符串(template string)是增强版的字符串,用反引号(`)标识(注意不是单引号)。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量和公式等东西:

模板字符串使得字符串与变量的结合,变得容易。下面是一个例子:

模板字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串:

与常规的函数不同,Templat函数所接收到的参数比较另类,像上方的函数tag依次接受三个参数。第一个参数是一个数组,该数组的成员是模板字符串中那些没有变量替换的部分,也就是说,变量替换只发生在数组的第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推。第一个参数之后的参数,都是模板字符串各个变量被替换后的值

也就是说,tag函数实际的参数如下:

下面是一个更复杂的例子,展示了如何将各个参数按照原来的位置拼合回去:

io.js入门(三)—— 所支持的ES6(下)
io.js入门(三)—— 所支持的ES6(下)

另外模板字符串还有一个 String.raw() 方法,往往用来充当模板字符串的处理函数,返回字符串被转义前的原始格式:

注:本文大部分内容参考自阮一峰老师的ES6入门,但本文实例已事先对所有代码进行了校正(包括在io.js上的兼容性、代码错误的堪正,以及部分未提及特性方法的补漏)。

就此我们便介绍了io.js上所支持的全部ES6特性,共勉~

io.js入门(三)—— 所支持的ES6(下)