目錄 第二章 字符串和正則表達式UTF-16碼位codePointAt()方法String.fromCodePoint()方法normalize()方法正則表達式u修飾符其餘字符串變動字符串中的字串識別repeat()方法其餘正則表達式語法變動y修飾符正則表達式的複製flags屬性模板字面量基礎語法多行字符串字符串佔位符標籤模板定義標籤原始值正則表達式
第二章 字符串和正則表達式數組
UTF-16碼位安全
在UTF-16中,前2^16^均以16位的編碼單元表示,這個範圍被稱做基本多文種平面(BMP, Basic Multilingual Plane)。超出這個平面的碼位則要歸屬於某個輔助平面(supplementary plane)。函數
UTF-16引入了代理對(surrogate pair),規定用兩個16位編碼單元表示一個碼位。也就是說,字符串裏的字符有兩種,一種是由一個編碼單位16位表示的BMP字符,另外一種是由兩個編碼單元32位表示的輔助平面字符。編碼
codePointAt()方法代理
這個方法接受編碼單元的位置,而非字符串位置做爲參數,返回與字符串中給定位置對應的碼位,即一個整數值。code
要檢測一個字符佔用的編碼單元數量,能夠調用該方法。orm
function is32Bit (c) { return c.codePointAt(0) > 0xFFFF; }
String.fromCodePoint()方法排序
使用codePointAt()方法檢索一個字符的碼位,使用String.fromCodePoint()方法根據執行的碼位生成一個字符。能夠看做完整版的String.fromCharCode()。索引
normalize()方法
normalize(str, type?)方法用於提供Unicode的標準化形式,同時能夠接受一個可選參數來指明標準:
須要注意,在進行字符串的排序和比較操做前,將被操做字符串按照同一標準進行標準化。
正則表達式u修飾符
當一個正則表達式添加了u修飾符,它就從編碼單元操做模式切換爲字符模式,如此一來正則表達式就不會視代理對爲兩個字符,從而徹底按照預期正常運行。例如(/^.$/u).test(str)。
使用這種方式能夠計算碼位的數量,解決length不能反映碼位數量的問題:
function codePointLength (str) { // 使用\s\S來確保能匹配新行 const result = str.match(/[\s\S]/gu); return result? result.length : 0; }
檢測其支持性:
function hasRegExpU () { try{ var pattern = new RegExp('.', 'u'); return true; } catch (err){ return false; } }
其餘字符串變動
字符串中的字串識別
它們都有第二個可選參數,表示匹配起始點的索引值。注意endWith()是從後向前索引的。
repeat()方法
repeat()接受一個number參數,表示重複的次數,返回值是當前字符串重複必定次數後的新字符串。
其餘正則表達式語法變動
y修飾符
它會影響正則表達式搜索過程當中的sticky屬性,當在字符串中開始字符匹配時,它會通知搜索從正則表達式的lastIndex屬性開始進行,若是在指定位置沒能成功匹配,則中止繼續匹配。能夠經過訪問正則表達式的sticky屬性來肯定這個表達式是否使用了y。
當執行操做時,y操做符會把上次匹配後面一個字符的索引保存在lastIndex中;若是該操做匹配的結果爲空,則lastIndex會被重置爲0。g修飾符的行爲與此相同。
須要注意,只有調用exex()和test()的時候纔會涉及lastIndex屬性,調用字符串的方法,如match(),就不會觸發粘滯行爲。
正則表達式的複製
在ES5中,var re2 = new RexExp(re1, 'i')對原有正則表達式的修飾符進行修改會報錯,可是ES6支持這種方式。
flags屬性
source屬性獲取正則表達式文本,ES6新增的flags屬性獲取修飾符。
模板字面量
ES6經過模板字面量的形式填補了一些特性:
基礎語法
模板字面量使用反撇號來實現,在內部使用反撇號時能夠加上轉義符號。
多行字符串
ES5中的作法是換行符\n來指示換行。
ES6的模板字面量支持直接換行書寫。其全部空白符都屬於字符串的一部分,須要注意縮進。
字符串佔位符
使用${param}的形式,將任何合法的JavaScript表達式嵌入到佔位符中,並將其做爲字符串的一部分輸出到結果中。它能夠訪問做用域中全部可訪問的變量。
let count = 10, price = 0.25, message = `${count} items cost ${(count * price).toFixed(2)}.`;
標籤模板
定義標籤
標籤能夠是一個函數,調用時傳入加工過的模板字面量各部分數據。第一個參數是一個數組,包含JS解釋事後的模板字面量字符串,它以後的全部參數都是每個佔位符的解釋值。它能夠執行對模板字面量內容的一系列處理。
function tag (literals, ...substitutions) { let result = ''; // literals.length === substitutions.length + 1 for (let i = 0; i < substitution.length; i++) { result += literals[i]; result += substitutions[i]; } // 處理最後一個literal return result += literals[literals.length - 1]; } message = tag`${count} items cost ${(count * price).toFixed(2)}.`;
原始值
literals.raw屬性能夠訪問字符轉義被轉換成等價字符前的原生字符串。