天天看點

ES6躬行記(9)——字元串

  在介紹字元串之前,有必要先了解一點Unicode的基礎知識,有助于了解ES6提供的新功能和新特性。

一、Unicode

  Unicode是一種字元集(即多個字元的集合),它的目标是涵蓋世界上的所有字元,為其提供唯一的辨別符,這個辨別符叫做碼位或碼點(Code Point)。碼位既可以用一個從0開始計算的數值表示,也可以用U+作為字首後面緊跟十六進制數表示。

  Unicode隻規定了每個字元的碼位,但并沒有規定如何用位元組序列(即二進制數字存儲方式)表示字元,于是就出現了字元編碼(Character Encoding)。Unicode包含多種字元編碼,例如UTF-8、UTF-16等,此處的UTF字首是Unicode Transformation Format的縮寫,即統一轉換格式,它們都是Unicode的一種實作方式。其中UTF-8是變長編碼,使用1~4個位元組表示一個字元,它的最小編碼單元(Code Unit)為一個位元組(即8位);而UTF-16使用2或4個位元組表示一個字元,它的最小編碼單元為兩個位元組(即16位)。

  Unicode的碼位範圍從U+0000到U+10FFFF,由于包含的字元衆多,是以會把它們劃分成17組,組也叫平面(Plane),每個平面包含2^16=65536個字元,其中第0個平面叫做基本多語言平面(Basic Multilingual Plane,簡稱BMP),碼位範圍從U+0000到U+FFFF(包含了ASCII碼),剩下的16個為輔助平面(Supplementary Plane)。

  JavaScript采用了UTF-16編碼的Unicode字元集,BMP中的字元可用一個16位的編碼單元表示,而輔助平面中的字元則要遵循UTF-16的代理對(Surrogate Pair)規則,即用兩個編碼單元表示。這意味着JavaScript中的一個Unicode字元,它的長度有可能是1,但也有可能是2。由于JavaScript中的字元串方法(例如substring()、charAt()等)都會受到這種編碼規則的影響,是以有時候會傳回出人意料的結果。不過好在ES6大幅增強了對Unicode的支援,有效避免了這種意外性情況的發生。

二、Unicode字元

  在JavaScript中,Unicode字元可以用Unicode轉義字元的形式(即\uXXXX)表示,其中4個“X”表示字元的碼位,而“X”是一個16進制字元,還要注意一點,ES5隻支援4個“X”。也就是說,這種形式隻能表示BMP中的字元(即U+0000到U+FFFF内的字元),如果要使用輔助平面中的字元,那麼需要寫兩個Unicode轉義字元。下面代碼中,第一個字元是BMP中的“向”,第二個字元是2号平面中的“