是否首选在RegExp对象或String对象上使用方法?

Dig*_*ane 6 javascript

Javascript中的RegExp对象和String对象都有正则表达式匹配方法.

RegExp 对象有方法

  • EXEC
  • 测试

String 对象有方法

  • 比赛
  • 搜索

execmatch方法非常相似:

/word/.exec("words");
//Result: ["word"]
"words".match(/word/);
//Result: ["word"]

/word/.exec("No match");
//Result: null
"No match".match(/word/);
//Result: null

/word/g.exec("word word");
//Result: ["word"]
"word word".match(/word/g);
//Result: ["word", "word"]
Run Code Online (Sandbox Code Playgroud)

testsearch也非常相似:

/word/.test("words");
//Result: true
"words".search(/word/);
//Result: 0
//Which can converted to a boolean:
"word".search(/word/) > -1;
//Result: true

/word/.test("No match");
//Result: false
"No match".search(/word/) > -1;
//Result: false
Run Code Online (Sandbox Code Playgroud)

是否倾向于在RegExp对象或String对象上使用方法?

jfr*_*d00 5

主要是个人偏好

这主要是个人偏好,尽管功能略有不同(参见上一段的差异).除非你想开始对性能测量进行基准测试并将问题转化为性能测试,否则它主要是个人偏好.

我更喜欢这样做:

string.match(/word/)
Run Code Online (Sandbox Code Playgroud)

因为我认为这使得代码读起来像我的大脑一样考虑操作.我正在使用字符串对象并在其中查找特定的正则表达式.对我来说,在字符串中查找某些内容是字符串对象上的一种方法.这对我来说就像:

object.action(tool)
Run Code Online (Sandbox Code Playgroud)

在我看来,面向对象的代码应该如何工作.

如果你有:

/word/.match(string)
Run Code Online (Sandbox Code Playgroud)

然后对我来说感觉像:

tool.action(object)
Run Code Online (Sandbox Code Playgroud)

我发现它不那么合乎逻辑,也不那么面向对象.是的,/word/技术上也是一个对象,但它不是我试图操作的对象,我认为它更像是我正在使用的对象的工具或参数.

显然两者都有效.你可以自己决定自己喜欢什么.

一个主要的区别

我认为你只能对正则表达式对象做一些事情.例如,如果要匹配正则表达式的所有匹配项,则必须创建正则表达式对象,将"g"选项传递给它,然后re.exec()多次调用以获取每个匹配项,直到exec返回null表示不再匹配.我认为你不能这样做string.match().