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

javascript自定义数组搜索原型遇到一些问题,javascript,arrays,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 = []}

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

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?函数名?

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

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

编辑:好的,因为您正在处理数组对象中数组索引以外的其他属性,所以应该检查您枚举的属性是否是自己的、非继承的:

因此,请检查:

//..
if (typeof searchStr == 'object') {
  //...
}
//..
我建议你至少:

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

或:


这是因为在本文中使用了关联数组循环来表示i,当应用于对象时,它也将在属性和方法上循环。在本例中,您将向数组添加一个searchRE方法,这将在循环中限定它。将循环更改为普通for循环

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

}
我有一篇关于js循环的博文:

谢谢。但你能给我指个地方了解一下吗?这是示例链接,为什么result3不会发生这种情况?如果数组键不是整数怎么办?我使用for in是因为我的数组不仅仅是整数,可能是字母数字?@uniqsign,在第三种情况下不会发生,因为您的正则表达式正在查找函数代码中的字母m,并且您的函数没有任何m字母,例如,请尝试:[]。searchRe/var returnArray/I;//->[“搜索”]
if (searchStr && searchStr.test) {
  //...
}
if (searchStr && typeof searchStr.test == 'function') {
  //...
}
if (Object.prototype.toString.call(searchStr) == '[object RegExp]') {
  //...
}
for(var i = 0; i < this.length; i++) {

}