underscore.js源碼,這個正則表達式是什麼意思?
toArray方法的源碼:
當obj是String時,直接使用正則表達式reStrSymbol就把字元串變為了字元數組,就像這樣:
我只查到了uD800-uDFFF是UTF-16的代理對,這是什麼原理?從貼吧和csdn都問過了,還是沒有得到答案。。。
正則貼在這裡:
var p = /[^ud800-udfff]|[ud800-udbff][udc00-udfff]|[ud800-udfff]/g;
幫忙解釋下, 在 ES6 之前, 有的 Unicode 字元無法用一個單一的 u 轉義, 需要拆分成一個代理對. 也就是 `[ud800-udbff][udc00-udfff]`. 比如 `"ud842udfb7".length` (直接打漢字被知乎吃了, 只能拆成轉義), 雖然只有一個漢字, 但字元串長度為 2.
正則在匹配的時候, 如果當前位置可以匹配到滿足的字元串, 則不會嘗試下一個分支, 即使下一個分支也能匹配並且字元串更短.UTF-16 代理項對,像是曾經搞掛 @vczh 的噶翠的
在 JavaScript 裡面是 16 個字,拆成單一碼點的「字元」數組的話,就得用這種形式。
三個分支裡面- [^ud800-udfff] 是普通的 BMP 字元
- [ud800-udbff][udc00-udfff] 是成對的代理項對
- [ud800-udfff] 是未成對的代理項字
這個正則按「|」分割,包含三個部分
[^ud800-udfff][ud800-udbff][udc00-udfff][ud800-udfff]第一個表示不包含代理對代碼點的所有字元
第二個表示合法的代理對的所有字元第三個表示代理對的代碼點(本身不是合法的Unicode字元)所以匹配的結果是分解為字元數組(如果是合法的字元一定會切分正確)。
關於UTF-16,其他答案解釋過了。
我覺得題主的問題大概是不知道正則表達式加了g以後可以返回所有match結果組成的數組。Unicode range D800–DFFF is used as surrogate pair in UTF-16 (used by Windows) and CESU-8 transformation formats, allowing these encodings to represent the supplementary plane code points, whose values are too large to fit in 16 bits. A pair of 16-bit code points — the first from the high surrogate area (D800–DBFF), and the second from the low surrogate area (DC00–DFFF) — are combined to form a 32-bit code point from the supplementary planes.
我自己也不知道,於是去查了下資料~
資料來源:談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞Unicode/Character reference/D000-DFFF編碼 unicode 及其在 javascript 中的使用新版本里去掉了這部分
// Safely create a real, live array from anything iterable.
_.toArray = function(obj) {
if (!obj) return [];
if (_.isArray(obj)) return slice.call(obj);
if (isArrayLike(obj)) return _.map(obj, _.identity);
return _.values(obj);
};
推薦閱讀:
※三大構成是什麼?
※為何大部分設計出眾的網站都做不大?
※為什麼有的網頁打開圖片是從上到下逐行打開,有的則是先顯示低解析度圖片再逐漸加入細節?
※你見過最好的 404 頁面是哪個?
※如何在排版編輯中建立網格系統?(具體軟體操作)
TAG:網頁設計 | 前端開發 | JavaScript | 正則表達式 | underscorejs |