2012-06-22 70 views
2

我遇到這個代碼在一個代碼庫中添加的indexOf功能:我應該使用哪個indexOf函數?

if (!Array.prototype.indexOf) 
{ 
    Array.prototype.indexOf = function(elt /*, from*/) 
    { 
    var len = this.length >>> 0; 

    var from = Number(arguments[1]) || 0; 
    from = (from < 0) 
     ? Math.ceil(from) 
     : Math.floor(from); 
    if (from < 0) 
     from += len; 

    for (; from < len; from++) 
    { 
     if (from in this && 
      this[from] === elt) 
     return from; 
    } 
    return -1; 
    }; 
} 

這是一個不同的執行情況向一個由Mozilla https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf推薦:

代碼:

if (!Array.prototype.indexOf) { 
     Array.prototype.indexOf = function (searchElement /*, fromIndex */) { 
      "use strict"; 
      if (this == null) { 
       throw new TypeError(); 
      } 
      var t = Object(this); 
      var len = t.length >>> 0; 
      if (len === 0) { 
       return -1; 
      } 
      var n = 0; 
      if (arguments.length > 0) { 
       n = Number(arguments[1]); 
       if (n != n) { // shortcut for verifying if it's NaN 
        n = 0; 
       } else if (n != 0 && n != Infinity && n != -Infinity) { 
        n = (n > 0 || -1) * Math.floor(Math.abs(n)); 
       } 
      } 
      if (n >= len) { 
       return -1; 
      } 
      var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); 
      for (; k < len; k++) { 
       if (k in t && t[k] === searchElement) { 
        return k; 
       } 
      } 
      return -1; 
     } 
    } 

我應該使用Mozilla版本,還是在問題開始時提到的版本就足夠了?使用其中一種的優點是什麼?

回答

2

我建議在indexOf上使用Mozilla版本。這與第一次實現非常相似,但更加精美(實際上這並不令人意外)。例如,它會返回-1,因爲它發現給定的數組是空的,並且會正確處理作爲第二個參數給出的不同邊值。或者更好的是,如果你使用jQuery(因爲它是你的標籤選擇暗示的),爲什麼不使用$.inArray()方法?

+0

他們都來自Mozilla的,但第二個是更近一些。 –

+0

有趣,不知道。 )+1給你的答案。 – raina77ow