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

javascript-从.split()生成的Google Chrome混乱数组,javascript,arrays,properties,google-chrome,split,Javascript,Arrays,Properties,Google Chrome,Split,给定以下字符串: var str = "one,two,three"; 如果我在逗号上拆分字符串,通常会得到一个数组,正如预期的那样: var arr = str.split(/\s*,\s*/); 麻烦的是,在谷歌Chrome(用于Mac)中,它会向数组添加额外的属性 Chrome调试器的输出: arr: Array 0: one 1: two 2: three constructor: function Array() index: undefin

给定以下字符串:

var str = "one,two,three";
如果我在逗号上拆分字符串,通常会得到一个数组,正如预期的那样:

var arr = str.split(/\s*,\s*/);
麻烦的是,在谷歌Chrome(用于Mac)中,它会向数组添加额外的属性

Chrome调试器的输出:

arr: Array
    0: one
    1: two
    2: three
    constructor: function Array()
    index: undefined
    input: undefined
    length: 3
因此,如果我使用
for/in
循环迭代数组,它将迭代新属性。特别是
输入
索引
属性。使用
hasOwnProperty
似乎没有帮助


修复方法是根据数组的长度为执行一个
循环。我仍然在想,是否有人能洞察为什么Chrome会这样做。Firefox和Safari没有这个问题。

不要在
循环中使用
for…对数组进行迭代!!这是Javascript()的众多陷阱之一-
for…in
循环仅用于迭代对象属性

将法线改为循环

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


Firefox和Safari的ECMAScript/Javascript引擎使这些特定属性不可枚举(
{DontEnum}
属性),因此它们不会在
for…in
循环中迭代。不过,
for…in
循环并不打算迭代数组索引。

通常不建议使用for/in循环迭代数组。首先,迭代的顺序是不能保证的,此外,您可能会遇到类似您现在遇到的问题。最好使用传统的for循环。

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

for ( var i = 0, l = arr.length, i < l; i++ )
{
  // do whatever with arr[i];
}
for(变量i=0,l=arr.length,i
与此特定问题没有直接关系,但请注意,使用正则表达式拆分字符串存在各种跨浏览器问题。有关更多信息和解决方案,请参阅。

我假设在此处使用regexp会产生类似数组的对象,非常类似于执行的结果


我无法在Chrome/Win7上重现这个bug,但我建议使用
Array.prototype.slice.call(arr)
magic。它以完美地将数组类转换为真实数组而闻名。

@KennyTM:why not
str.split(',')
?很明显patrick这样做是为了从结果数组中的项中删除空格填充。@Peter:事实上,我的评论是针对KennyTM的,因为我不知道为什么你会使用正则表达式只在逗号上进行拆分。所以听起来数组上的
for/in
是不好的。我明白了。仍然好奇为什么Chrome会尝试迭代
输入
索引
。或者它们为什么会在那里。您忘记使用定义的max变量;)@加比:是的,我刚刚意识到我自己,哈哈。这是漫长的一天:-)你的编辑似乎是关键。由于某种原因,Chrome不会使这些属性不可枚举。我将坚持使用基于长度的循环。感谢您的链接,Pointy.:)