2010-10-12 90 views
2

如果我需要查看某個值是否在字符串中,那麼使用.test()方法或.search()方法的性能會更好嗎?JavaScript性能 - .test()與.search()

例如使用.search():

var myRegExp = '/Orange/', 
    myString = 'This is a string with the word "Orange."'; 

if(myString.search(myRegExp) != -1) { 
    // Do code here 
} 

例如使用。測試():

var myRegExp = '/Orange/', 
    myString = 'This is a string with the world "Orange."'; 

if(myRegExp.test(myString)) { 
    // Do code here 
} 

最終,我做的是搜索字符串中的一個特定的類名。該元素將包含多個類,所以我需要找出是否有其中一個類。

示例標記:

<ul> 
    <li class="expandable expanded"> 
     <ul> 
      <li>Text</li> 
     </ul> 
    <li> 
    <li class="expandable collapsed"> 
     <ul> 
      <li>Text</li> 
     </ul> 
    </li> 
</ul> 

所以,我加入一個click事件列表中的項目,如果他們有類名「擴展」他們需要表現的一種方式,如果他們有類名「崩潰」他們需要表現另一個。

所以,基本上是這樣的。

element.addEventListener('click',function(e) { 
    if(/* e.target has class name of expanded */) { 
     // Do certain code 
    } else { 
     // Do other code 
    } 
} 

我使用的是jQuery,我很樂意提供建議,但我覺得這種情況會更好地與本機JavaScript。那麼,哪種方法可以提供最佳性能?或者還有另一種更好的方法嗎?

+2

http://jsperf.com/ – 2010-10-12 19:04:05

回答

5

好吧,如果你正在使用jQuery,你可以做到這一點簡單地用

element.addEventListener('click',function(e) { 
    if($(e.target).hasClass('expanded') { 
     // Do certain code 
    } else { 
     // Do other code 
    } 
} 

如果您不希望創建出於某種原因(如性能),你可以使用此功能的jQuery對象,改編從$().hasClass()來源:

function hasClass (el, selector) { 
    var className = " " + selector + " "; 

    if ((" " + el.className + " ").replace(/[\n\t]/g, " ").indexOf(className) > -1) { 
     return true; 
    } 

    return false; 
} 

然後,您可以調用這個像這樣:

if (hasClass(e.target, 'expanded')) { 

就我個人而言,如果你已經加載了,我會選擇jQuery方法。

+0

好吧,我已經加載了該庫,但該頁面非常強大,所以我想優化每一個性能。然而,這樣做告訴我的是,不是.test()或.search(),jQuery團隊決定使用.indexOf()來查看該值是否在字符串中,我沒有想到的,並且可能是最佳表現路線。 – RussellUresti 2010-10-12 19:20:28

+0

@RusselUrest這個答案應該告訴你的是:不用擔心自己做這個,只需使用'hasClass()'函數 – 2010-10-12 19:21:24

+2

jQuery和純JS解決方案之間的比較:http://jsperf.com/pure- js-hasclass-vs-jquery-hasclass @Josh該函數與jQuery的hasClass函數不同 - 它不需要jQuery選擇器對象。 – lonesomeday 2010-10-12 19:37:55

3

test()返回true或false。 search()返回匹配的位置,如果找不到匹配,則返回-1。

所以,我認爲測試()會更快。

+1

是的,通過測試,事實證明test()比search()更快。測試()對indexOf()雖然有點不清楚。大多數瀏覽器的indexOf()速度提高了10%左右,但在Chrome中,test()速度提高了50%以上,所以我想這取決於誰使用你的網站。 – RussellUresti 2010-10-13 15:47:29

+0

不錯,每一個小小的表現增加都有幫助。 – mac 2010-10-14 08:36:53

0

我有同樣的問題,在做了一些閱讀後,我發現使用本機字符串方法indexOf是性能角度最好的方法。這test也證明了這一點。所以apporpriate的方式將

var searchStr = 'Orange', 
    myString = 'This is a string with the world "Orange."'; 

if(myString.indexOf(searchStr) != -1) { 
    // Do code here 
} 

雖然這個問題有點舊,它仍然有用。我發現this question也有很好的解釋。