javascript自定义数组搜索原型遇到了一些问题

时间:2010-11-04 05:56:33

标签: javascript arrays

我创建了一个数组搜索原型

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”?功能名称?

2 个答案:

答案 0 :(得分:0)

这是因为您使用for-in语句遍历数组,并且此语句枚举了继承的属性(作为searchRe函数)。

for-in语句的目的是枚举对象属性,遍历数组始终建议使用顺序循环。

<子> ...&LT;剪断&GT; ...

编辑:好的,既然您正在处理数组对象中“数组索引”之外的其他属性,则应检查您枚举的属性是否为自己的属性,非继承

//...
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:检测参数何时是RegExp对象时会遇到问题。

在Chrome中,有一个语法扩展,允许您“调用”一个RegExp对象,就像它是一个函数一样,Firefox也允许这样做,但在Chrome中,真正的问题是typeof运算符返回{ {1}}而是预期的"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') {
  //...
}

答案 1 :(得分:0)

这是因为你正在使用一个关联数组循环(对于i),当应用于一个对象时,它也将遍历属性和方法。在这种情况下,您将向数组添加“searchRE”方法,该方法在循环中对其进行限定。将循环更改为正常循环。

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

}

我有关于js循环的博客文章: http://slappyza.wordpress.com/2010/10/03/fast-loops-in-javascript/