我指的是MDN Documentation for Javascript here。
它表示不推荐使用以下RegExp属性:
$1-$9
$_
$*
$&
$+
$`
$'
input
lastMatch
lastParen
leftContext
rightContext
为什么他们会被弃用? Aren他们都有用吗?有什么新的替代品,如果有的话?
具体来说,文件说:
"不推荐使用以下属性。这不会影响它们在替换字符串中的使用。"
这听起来不自相矛盾吗?
答案 0 :(得分:3)
它们已被弃用,因为它是一个难以正确使用并泄漏信息的API。当您对正则表达式进行匹配时,通常您希望匹配函数返回一个值,或者至少在RegExp
实例本身上进行跟踪。需要说明的是,这些是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')
。