2010-11-04 65 views
0

我創建一個數組搜索原型JavaScript的定製陣列搜索原型有一些問題

 
Array.prototype.searchRE = function(searchStr) { 
    var returnArray = false; 
    for (i in this) { 
     if (typeof(searchStr) == 'object') { 
     if (searchStr.test(this[i])) { 
      if (!returnArray) {returnArray = []} 
      returnArray.push(i); 
     } 
     } else { 
     if (this[i] === searchStr) { 
      if (!returnArray) {returnArray = []} 
      returnArray.push(i); 
     } 
     } 
    } 
    return returnArray; 
} 

var mycars = new Array(); 
mycars[0] = "Saab"; 
mycars[1] = "Volvo"; 
mycars[2] = "BMW"; 

result1=mycars.searchRe(/bm/i); // return 2 
result2=mycars.searchRe(/b/i); // return 0,2,searchRe 
result3=mycars.searchRe(/m/i); // return 2 

我的問題是沒有2,爲什麼它返回「searchRe」?函數名?

回答

0

發生這種情況是因爲您正在使用for-in語句遍歷數組,並且此語句枚舉了繼承的屬性(如您的searchRe函數)。

for-in的語句的目的是枚舉對象屬性,來遍歷陣列順序循環總是建議。

... <剪斷> ...

編輯:好吧,既然你在你的數組對象處理等性能比「數組索引」,你應該檢查你枚舉屬性自己,非繼承

//... 
for (var i in this) { // <- notice `var i`, otherwise `i` will be global 
    if (this.hasOwnProperty(i)) { // the property physically exist on the object 
    //.. 
    } 
} 
//.. 

編輯2:您將有問題的檢測時,該參數是一個雷傑xp對象。

在Chrome中,語法擴展允許您像調用函數一樣「調用」RegExp對象,Firefox也允許這樣做,但在Chrome中,真正的問題是typeof運算符返回"function"而不是預期的"object"結果,例如:

var re = /a/; 
re('a'); // equivalent to call re.exec('a'); 

typeof re; // "function" on Chrome, "object" in other implementations 

所以,不是檢查:

//.. 
if (typeof searchStr == 'object') { 
    //... 
} 
//.. 

我建議你至少:

if (searchStr && searchStr.test) { 
    //... 
} 

或者:

if (searchStr && typeof searchStr.test == 'function') { 
    //... 
} 

或者:

if (Object.prototype.toString.call(searchStr) == '[object RegExp]') { 
    //... 
} 
+0

謝謝。但是,你能指點我到什麼地方去了解這個嗎? 這是示例鏈接http://jsfiddle.net/mvTce/ 爲什麼result3不會發生這種情況? – cww 2010-11-04 06:01:24

+0

如果數組鍵不是整數?我用於因爲我的數組不僅是整數,可能是字母數字? – cww 2010-11-04 06:08:21

+0

@uniqsign,在第三種情況下不會發生,因爲你的正則表達式在函數的代碼中尋找字母'm',而你的函數沒有'm'字母,例如try:'[ ]。searchRe(/ var returnArray/i); // - > ['searchRe']' – CMS 2010-11-04 06:18:11

0

這是因爲使用的是一個關聯數組循環(對於i在此),其中,當施加到物體將循環過屬性和方法。在這種情況下,您正在爲數組添加一個「searchRE」方法,從而在循環中對其進行限定。將您的循環更改爲正常循環。

for(var i = 0; i < this.length; i++) { 

} 

我有一個博客帖子大約JS循環: http://slappyza.wordpress.com/2010/10/03/fast-loops-in-javascript/