代码之家  ›  专栏  ›  技术社区  ›  user113716

javascript-从.split()生成的Google Chrome杂乱数组

  •  4
  • user113716  · 技术社区  · 14 年前

    给定以下字符串:

    var str = "one,two,three";
    

    如果我在逗号上拆分字符串,我通常会得到一个数组,如预期的那样:

    var arr = str.split(/\s*,\s*/);
    

    问题在于,在Google Chrome(Mac)中,它向数组附加了额外的属性。

    Chrome调试器的输出:

    arr: Array
        0: one
        1: two
        2: three
        constructor: function Array()
        index: undefined
        input: undefined
        length: 3
    

    所以如果我用 for/in 循环,它迭代新属性。特别是 input index 性质。使用 hasOwnProperty 似乎没有帮助。

    解决办法是 for 基于数组长度的循环。不过,我想知道是否有人知道为什么Chrome会这样做。火狐和Safari没有这个问题。

    5 回复  |  直到 13 年前
        1
  •  11
  •   Community Egal    7 年前

    不要使用 for...in 循环!!这是javascript的众多陷阱之一( plug - 为了…… 循环仅用于迭代对象属性。

    将Normal用于循环。

    for (var i=0, max = arr.length; i < max; i++) { ... } 
    


    火狐和Safari的ecmascript/javascript引擎使这些特定属性不可枚举。( {DontEnum} 属性),因此不会在 为了…… 循环。仍然, 为了…… 循环无意在数组索引上迭代。
        2
  •  3
  •   Peter Bailey    14 年前

    For..in 用于迭代对象的可枚举属性。对于一个数组,要遍历它的索引,只需使用一个标准for循环

    for ( var i = 0, l = arr.length, i < l; i++ )
    {
      // do whatever with arr[i];
    }
    
        3
  •  2
  •   Pointy    14 年前

    与这个特定问题不直接相关,但请注意,使用正则表达式拆分字符串有各种跨浏览器的问题。见 http://blog.stevenlevithan.com/archives/cross-browser-split 更多信息和解决方案。

        4
  •  1
  •   Daniel Vassallo    14 年前

    通常,不建议使用for/in循环迭代数组。首先,迭代的顺序是不确定的,另外,您也会面临像您所拥有的那样的风险问题。最好使用传统的for循环。

        5
  •  0
  •   Lapple    13 年前

    我假设在这里使用regexp会导致类似数组的对象,这与执行 RegExp.exec() .

    我不能在chrome/win7上复制这个bug,但我建议使用 Array.prototype.slice.call(arr) 魔术。它以完美地将类似数组转换为实际数组而闻名。