(接上篇)
标準ES6特性
6. 新的String方法/New String methods
7. 符号/Symbols
8. 字元串模闆/Template strings

新的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)上顯示:
View Code
接着我們通路位址 http://127.0.0.1:1337/ 可看到如下内容:

startsWith(),endsWith() 和 includes()
正常我們會使用 s.indexOf() 來檢測一個字元串裡是否含有某段字元串。ES6提供了3個新的字元串檢索方法,其中 startsWith() 和 endsWith() 分别用于從頭部/尾部開始比對字元串片段,includes()則沒有位置限定,它們都傳回boolean值。這三個方法都很好了解,直接上例子吧:
這三個方法均支援第二個參數,表示開始搜尋的位置:
注意endsWith()加上第二個參數後,表示比對從開始到參數索引位置結束的字元串。

repeat()
repeat()傳回一個新字元串,表示将原字元串重複n次:

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),即在相容等價的前提下,傳回合成字元分解的多個簡單字元。

符号/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除了可作為對象的某個獨一無二的、不可枚舉的屬性,還有一個用處是可用于描述:

字元串模闆/Template strings
模闆字元串(template string)是增強版的字元串,用反引号(`)辨別(注意不是單引号)。它可以當作普通字元串使用,也可以用來定義多行字元串,或者在字元串中嵌入變量和公式等東西:
模闆字元串使得字元串與變量的結合,變得容易。下面是一個例子:
模闆字元串可以緊跟在一個函數名後面,該函數将被調用來處理這個模闆字元串:
與正常的函數不同,Templat函數所接收到的參數比較另類,像上方的函數tag依次接受三個參數。第一個參數是一個數組,該數組的成員是模闆字元串中那些沒有變量替換的部分,也就是說,變量替換隻發生在數組的第一個成員與第二個成員之間、第二個成員與第三個成員之間,以此類推。第一個參數之後的參數,都是模闆字元串各個變量被替換後的值
也就是說,tag函數實際的參數如下:
下面是一個更複雜的例子,展示了如何将各個參數按照原來的位置拼合回去:
另外模闆字元串還有一個 String.raw() 方法,往往用來充當模闆字元串的處理函數,傳回字元串被轉義前的原始格式:
注:本文大部分内容參考自阮一峰老師的ES6入門,但本文執行個體已事先對所有代碼進行了校正(包括在io.js上的相容性、代碼錯誤的堪正,以及部分未提及特性方法的補漏)。
就此我們便介紹了io.js上所支援的全部ES6特性,共勉~