它們已被棄用,因爲它很難正確使用並泄漏信息。當你在正則表達式上進行匹配時,通常你會期望匹配函數返回一個值,或者至少在實例本身上進行跟蹤。要清楚的是,這些屬性是RegExp
,而不是實例。以這個例子:
var re = /([0-9])([0-9])([0-9])/;
re.test("345");
var three = RegExp.$1;
var four = RegExp.$2;
var five = RegExp.$3;
這是一個嚴重醜陋的API。
不僅難以使用,而且這意味着如果你正在編寫一個庫,事情可以訪問你的API的內部狀態。還有在這個例子中其他危險,但考慮像一個案例:
matchPrivateKey();
var private = RegExp.$1;
如果裏面matchSecretKey
您使用正則表達式匹配一些私人密鑰,現在是你的模塊之外訪問並泄露給上運行的其他代碼頁。
它是好得多使用API等
var re = /([0-9])([0-9])([0-9])/;
var [, three, four, five] = "345".match(re);
其中.match
返回與所匹配的結果的數組。
從來沒有你期望對象實例在構造函數上改變屬性的時候。
「下面的屬性過時。這不會影響在替換字符串中的使用。」
這聽起來不自相矛盾嗎?
根本不是。 RegExp
上的屬性已被棄用,但做了"345".replace(/3([0-9])5/, '$1')
仍然完全找不到,因爲字符串模式與構造函數屬性無關。
你希望將它們用於什麼?知道該使用什麼更有用,但不知道自己在做什麼很難說。 – loganfsmyth
問題是它們是* global *(static)屬性,通過正則表達式實例上的方法調用分配。這包括泄漏信息,在意外時間改變價值,並且通常導致錯誤行爲和不可讀的代碼。 – Bergi