我创建了一个数组搜索原型
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 :(得分: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/