2012-01-10 52 views
0

在JavaScript中構建一個CSS選擇器引擎筆者使用下面的代碼字符串中的散列字符之前刪除一切(對於TUTS +會員here可見)的教程:性能分裂()在SUBSTR()的

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

雖然我是一名JavaScript初學者,但我不是初學者的程序員。這似乎是一種壓倒性的行動,就像用大炮殺死一隻螞蟻。我會使用類似:

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

甚至不與已經使用indexof() if語句封閉。所以,當作者甚至寫了一本關於JavaScript的書時,我一定有一些祕密我不知道:使用前代碼有什麼好處?在表現可能?

+3

如果'split()'的開銷小於你的建議,我會被震撼。可悲的是,那裏有很多糟糕的JavaScript書籍和教程。 (當然,我對你的教程一無所知,所以這可能只是一個異常,或者是某些貨物崇拜的「傳統」的結果。) – Pointy 2012-01-10 13:36:49

+0

哦另外:你可以使用[this website](http:// jsperf .com)進行一些簡單的比較性能測試。 – Pointy 2012-01-10 13:37:40

+0

繼續並在您想要使用它的特定頁面上分析兩種方式。沒有一個適用於所有情況的硬性規定。 – Piskvor 2012-01-10 13:39:21

回答

1

不同實現之間的性能通常會有很大差異,因此需要進行測試。但如果表現真的是一個考慮因素,我敢打賭.split()比較慢。

「甚至不附帶if語句...」

但我要說的是,你should't有它內嵌像你一樣。如果找不到匹配,.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("#"); 
} 
0

我不確定本教程試圖做什麼,但sel="div#main li#first"是有效的CSS,它們的代碼將返回#firstsel.substr(sel.indexOf("#"));將返回#main li#first。我猜測,但這可以在你通過CSS選擇器向後工作的循環中工作。

-1

Real life CSS selector engines使用正則表達式的一切,這似乎是最好的方式。該語言爲我們提供了一個用於字符串操作的專用強大工具,所以爲什麼不使用它。在你的情況下:

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

快速的工作,沒有額外的混亂。

表現?在JavaScript中,我們通常不太在意,因爲我們的應用程序不是時間關鍵的。沒有人在乎是否需要0.1秒或0.01秒來驗證表格或淡入div。