咱們知道unicode字符集的範圍是U+0000到U+10ffff
其中每一個unicode碼點對應一個字符,若是這個碼點尚未設置字符,默認會是?
若是字符在U+0000到U+ffff咱們能夠輕鬆地使用Unicode轉義序列進行表示es6
'a' === '\u0061'
可是若是範圍大於U+ffff時咱們就須要兩個這樣的序列來表示,也叫代理對,例如正則表達式
'?' === '\ud83d\udebe'
這顯然是很是麻煩的
es6針對unicode新增了一個新的轉義序列,能夠叫爲碼點轉義序列app
'?' === '\u{1f6be}'
使用一個大括號包圍一串對應碼點的16進制數值,數值能夠爲1到6位數編碼
除了新增表示字符的方法外,也新增了讀取字符碼點的方法
咱們知道js的字符在內存中是按UTF-16對字符進行編碼,也就是說js操做字符的基本單位是
2個字節,所以es6以前的方法對操做由代理對生成的字符會出現問題,例如chartAt,charCodeAt,length,slice,indexOf等都不能返回你所指望的結果,例如3d
'?'.length === 2 '?'.charCodeAt(0) === 55357
爲了獲取正確的碼點值咱們能夠使用 codePointAt代理
'?'.codePointAt(0) === 128702 128702..toString(16) === '1f6be'
經過碼點值咱們也能夠獲取相應的字符 使用的是fromCodePoint這個靜態方法,傳入的是一個數值code
String.fromCodePoint(0x1f6be) === "?" String.fromCodePoint(128702) === "?"
利用這個方法咱們就能夠很是方便地枚舉出所有Unicode字符集對應的字符了
我找了一下找到挺多有趣的字符
'©','®','°','±','¼','ϾϿ','֍','Ⅸ','∜','⒇','⓻','♽','⬢','⭐','⯑','☯'
'?','?','?','?','?','?','?','?','?','?','?'內存
爲了正確獲取字符的長度,咱們能夠利用新增的es6擴展運算符unicode
[...'?'].length === 1
對於字符的匹配,正則表達式也增長了/u修飾符get
/\u{1f6be}/.test('?') === false /\u{1f6be}/u.test('?') === true
能夠說es6新增的方法基本上全面考慮到unicode的整個字符集,
下面的方法能夠很是方便地獲取整個字符集,若是不怕死機能夠一次所有獲取
function renderUnicode(min,max) { let diff = 1024; function render() { const ele = document.getElementsByClassName('box')[0]; const textNode = ele.firstChild; let str = '' for (let i = min; i < min + diff; i++) { str += String.fromCodePoint(i); } min = min + diff; textNode.appendData(str); if (min > max) { alert('done'); return; } requestAnimationFrame(render); } render(); } renderUnicode(0x0000, 0xffff);//BMP平面 // renderUnicode(0x10000, 0x1ffff); // renderUnicode(0x20000, 0x2ffff); // renderUnicode(0x30000, 0x3ffff); // renderUnicode(0x40000, 0x4ffff); // renderUnicode(0x50000, 0x5ffff); // renderUnicode(0x60000, 0x6ffff); // renderUnicode(0x70000, 0x7ffff); // renderUnicode(0x80000, 0x8ffff); // renderUnicode(0x90000, 0x9ffff); // renderUnicode(0xA0000, 0xAffff); // renderUnicode(0xB0000, 0xBffff); // renderUnicode(0xC0000, 0xCffff); // renderUnicode(0xD0000, 0xDffff); // renderUnicode(0xE0000, 0xEffff); // renderUnicode(0xf0000, 0xfffff); // renderUnicode(0x100000, 0x10ffff);