split()对substr()的性能

Performance of split() over substr()

本文关键字:性能 split substr      更新时间:2023-09-26

在用JavaScript构建CSS选择器引擎的教程中(对Tuts+成员可见),作者使用以下代码删除散列字符之前字符串中的所有内容:

// sel = "div#main li"
if (sel.indexOf("#") > 0) {
    sel = sel.split("#");
    sel = "#" + sel[sel.length -1];
}

虽然我是一个JavaScript初学者,但我不是一个初学者程序员。这似乎是一次压倒性的行动,就像用大炮杀死一只蚂蚁。我会用这样的东西:

sel.substr(sel.indexOf("#"));

甚至可能没有包含在已经使用indexof()的if语句中。因此,正如作者甚至写了一本关于JavaScript的书一样,一定有一些秘密我不知道:使用以前的代码有什么好处吗?也许是表演?

不同实现之间的性能通常差异很大,因此需要进行测试。但如果性能真的是一个考虑因素,我敢打赌.split()会更慢。

"甚至可能没有附上if语句…"

但我想说的是,你不应该像现在这样内联它。如果没有找到匹配项,.indexOf()将返回-1,这将导致.substr给你字符串的最后一个字符。

var sel = 'tester';
sel.substr(sel.indexOf("#")); // "r"

所以保持if语句。。。

var sel = 'tester',
    idx = sel.indexOf("#"),
    sub;
if( idx !== -1 ) {
    sub = sel.substr("#");
}

我不确定教程试图做什么,但sel="div#main li#first"是有效的CSS,他们的代码将返回#firstsel.substr(sel.indexOf("#"));将返回#main li#first。我猜,但这可以在一个循环中工作,在这个循环中,您可以通过CSS选择器进行反向工作。

现实生活中的CSS选择器引擎对所有内容都使用正则表达式,这似乎是最好的方法。该语言为我们提供了一个专门的强大的字符串操作工具,所以为什么不使用它呢

 sub = sel.replace(/^.+?#/, "#")

工作做得很快,没有多余的杂物。

性能?在javascript中,我们通常不太在意,因为我们的应用程序不是时间关键型的。没有人关心验证表单或在div中淡入是需要0.1秒还是0.01秒。