【问题标题】:javascript custom array search prototype got some problemsjavascript自定义数组搜索原型有一些问题
【发布时间】:2010-11-04 05:56:32
【问题描述】:

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

Array.prototype.searchRE = function(searchStr) { 变种返回数组=假; 对于(我在这个){ if (typeof(searchStr) == 'object') { if (searchStr.test(this[i])) { if (!returnArray) {returnArray = []} returnArray.push(i); } } 别的 { if (this[i] === searchStr) { if (!returnArray) {returnArray = []} returnArray.push(i); } } } 返回返回数组; } var mycars = new Array(); mycars[0] = "萨博"; mycars[1] = "沃尔沃"; mycars[2] = "宝马"; 结果1=mycars.searchRe(/bm/i); // 返回 2 结果2=mycars.searchRe(/b/i); // 返回 0,2,searchRe 结果3=mycars.searchRe(/m/i); // 返回 2

我的问题是没有 2,为什么它返回“searchRe”?函数名?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    发生这种情况是因为您正在使用 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:您将无法检测参数何时是 RegExp 对象。

    在 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]') {
      //...
    }
    

    【讨论】:

    • 谢谢。但是你能指点我到某个地方来了解这个吗?这是示例链接jsfiddle.net/mvTce,为什么 result3 不会发生这种情况?
    • 如果数组键不是整数怎么办?我使用 for in 因为我的数组不仅是整数,可能是字母数字?
    • @uniqsign,在第三种情况下不会发生,因为您的正则表达式正在函数代码中查找字母 m,而您的函数没有任何 m 字母,例如,尝试:[].searchRe(/var returnArray/i); // -&gt; ['searchRe']
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-02
      • 2012-06-30
      • 2021-07-22
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      相关资源
      最近更新 更多