Javascript split()对substr()的性能

Javascript split()对substr()的性能,javascript,performance,Javascript,Performance,在一个用JavaScript构建CSS选择器引擎的教程(对Tuts+成员可见)中,作者使用以下代码删除哈希字符之前字符串中的所有内容: // sel = "div#main li" if (sel.indexOf("#") > 0) { sel = sel.split("#"); sel = "#" + sel[sel.length -1]; } 虽然我是一个JavaScript初学者,但我不是一个程序员初学者。这似乎是一个压倒性的行动,就像用大炮杀死一只蚂蚁。我会使用类

在一个用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的书时,一定有一些我不知道的秘密:使用前一个代码有什么好处吗?关于性能,也许?

我不确定本教程要做什么,但是
sel=“div”main li#first“
是有效的CSS,它们的代码将返回
\first
sel.substr(sel.indexOf(“#”)
将首先返回
#main li#
。我猜,但这可能会在一个循环中起作用,在这个循环中,您可以通过CSS选择器反向工作。

不同的实现之间通常会有很大的性能差异,因此需要进行测试。但如果性能真的是一个考虑因素,我敢打赌
.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("#");
}
对所有事情都使用正则表达式,这似乎是最好的方法。该语言为我们提供了一个专门的强大的字符串操作工具,为什么不使用它呢。就你而言:

 sub = sel.replace(/^.+?#/, "#")
工作速度快,没有额外的混乱


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

如果
split()
的开销小于您的建议,我会感到震惊。遗憾的是,有很多糟糕的JavaScript书籍和教程。(当然,我对你的教程一无所知,所以这可能只是一个反常现象,或者是一些货运狂热的“传统”的结果。)哦,还有:你可以用它来做一些简单的比较性能测试。继续,在你想要使用它的特定页面上对两种方式进行分析。没有一条硬性的规则适用于任何情况。我也不会使用substr,而是使用或slice-我在substr不跨浏览器时开始使用JS谢谢@Pointy。最后,我真的认为本教程计划得很糟糕,我看到了很多其他不一致之处。这门课让我很感兴趣,但后来我意识到它并没有什么“新”。其中一个“如果我知道它是那么简单,我会做得更好”…