已弃用 Javascript RegExp 属性的替代方案
Alternatives for deprecated Javascript RegExp properties
我指的是MDN Documentation for Javascript here.
它表示以下 RegExp 属性已弃用:
-
$_
$*
$&
$+
$`
$'
input
lastMatch
lastParen
leftContext
rightContext
为什么它们已被弃用?它们不都是有用的属性吗?如果有的话,新的替代品是什么?
具体来说,文档说:
"The following properties are deprecated. This does not affect their use in replacement strings."
这听起来是不是自相矛盾?
它们已被弃用,因为它 API 难以正确使用并且会泄露信息。当您在正则表达式上进行匹配时,通常您希望匹配函数返回一个值,或者至少在 RegExp
实例本身上进行跟踪。需要明确的是,这些是 RegExp
的属性,而不是 实例 的属性。举个例子:
var re = /([0-9])([0-9])([0-9])/;
re.test("345");
var three = RegExp.;
var four = RegExp.;
var five = RegExp.;
那是一个非常丑陋的 API。
不仅难以使用,而且这意味着如果您正在编写一个库,那么东西可以访问您的 API 的内部状态。此示例中还有其他危险,但请考虑以下情况:
matchPrivateKey();
var private = RegExp.;
如果您在 matchSecretKey
中使用了正则表达式来匹配一些私钥,它现在可以在您的模块外部访问并泄露给页面上的其他代码 运行。
使用像
这样的API会更好
var re = /([0-9])([0-9])([0-9])/;
var [, three, four, five] = "345".match(re);
其中 .match
returns 包含匹配结果的数组。
您永远不会期望对象实例在构造函数上改变属性。
"The following properties are deprecated. This does not affect their use in replacement strings."
这听起来是不是自相矛盾?
完全没有。 RegExp
上的属性已弃用,但是 "345".replace(/3([0-9])5/, '')
仍然完全可以找到,因为字符串模式与构造函数 属性.
无关
我指的是MDN Documentation for Javascript here.
它表示以下 RegExp 属性已弃用:
-
$_
$*
$&
$+
$`
$'
input
lastMatch
lastParen
leftContext
rightContext
为什么它们已被弃用?它们不都是有用的属性吗?如果有的话,新的替代品是什么?
具体来说,文档说:
"The following properties are deprecated. This does not affect their use in replacement strings."
这听起来是不是自相矛盾?
它们已被弃用,因为它 API 难以正确使用并且会泄露信息。当您在正则表达式上进行匹配时,通常您希望匹配函数返回一个值,或者至少在 RegExp
实例本身上进行跟踪。需要明确的是,这些是 RegExp
的属性,而不是 实例 的属性。举个例子:
var re = /([0-9])([0-9])([0-9])/;
re.test("345");
var three = RegExp.;
var four = RegExp.;
var five = RegExp.;
那是一个非常丑陋的 API。
不仅难以使用,而且这意味着如果您正在编写一个库,那么东西可以访问您的 API 的内部状态。此示例中还有其他危险,但请考虑以下情况:
matchPrivateKey();
var private = RegExp.;
如果您在 matchSecretKey
中使用了正则表达式来匹配一些私钥,它现在可以在您的模块外部访问并泄露给页面上的其他代码 运行。
使用像
这样的API会更好var re = /([0-9])([0-9])([0-9])/;
var [, three, four, five] = "345".match(re);
其中 .match
returns 包含匹配结果的数组。
您永远不会期望对象实例在构造函数上改变属性。
"The following properties are deprecated. This does not affect their use in replacement strings."
这听起来是不是自相矛盾?
完全没有。 RegExp
上的属性已弃用,但是 "345".replace(/3([0-9])5/, '')
仍然完全可以找到,因为字符串模式与构造函数 属性.