2017-07-16 30 views
-1

我指的是MDN Documentation for Javascript here不贊成使用Javascript的替代品RegExp屬性

它說以下的RegExp屬性已被棄用:

$1-$9 
$_ 
$* 
$& 
$+ 
$` 
$' 
input 
lastMatch 
lastParen 
leftContext 
rightContext  

爲什麼他們成爲過時的?它們不都是有用的屬性嗎?有什麼新的替代品?

具體來說,documantation說:

「以下屬性已被棄用這並不影響在替換字符串中的使用。」

這聽起來不自相矛盾嗎?

+1

你希望將它們用於什麼?知道該使用什麼更有用,但不知道自己在做什麼很難說。 – loganfsmyth

+0

問題是它們是* global *(static)屬性,通過正則表達式實例上的方法調用分配。這包括泄漏信息,在意外時間改變價值,並且通常導致錯誤行爲和不可讀的代碼。 – Bergi

回答

3

它們已被棄用,因爲它很難正確使用並泄漏信息。當你在正則表達式上進行匹配時,通常你會期望匹配函數返回一個值,或者至少在實例本身上進行跟蹤。要清楚的是,這些屬性是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')仍然完全找不到,因爲字符串模式與構造函數屬性無關。