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字元)

所以匹配的結果是分解為字元數組(如果是合法的字元一定會切分正確)。

實際上這個代碼寫得並不很緊湊,直接用 [ud800-udbff][udc00-udfff]|[sS] 即可。


關於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 |