2

我现在很困惑,有人能给我解释一下吗?也许这是我没有注意到的小事,但我很困惑为什么这没有像我预期的那样产生。

我创建了一个示例来显示我看到的问题......

样品 1

var dataString = "abc";

document.write(" This is a test ... " + "<br/>")
for (i in dataString ) {
    document.write("<br/> +" + dataString[i] + ": ")
    for (k in dataString ) {
        document.write(" ="+dataString[k] +", ");
    }
}
​

现在,我在Chrome中的结果是:

This is a test ... 

+a: 
+b: 

FireFox中是:(这是我预期的结果)

This is a test ... 

+a: =a, =b, =c, 
+b: =a, =b, =c, 
+c: =a, =b, =c, 

IE8中的结果是:

This is a test ... 

谁能向我解释这里发生了什么?我错过了一些重要的事情吗?

"abc".split("")注意:您可以按照此示例将字符串转换为跨浏览器的数组,只需记住这不再是字符串,现在如果您输出它,它将作为数组输出a,b,c

4

2 回答 2

3
for (i in dataString ) {
    document.write("<br/> +" + dataString[i] + ": ")

JavaScript 标准 (*) 不要求字符串的字符可以作为编号属性访问;这是 Mozilla 最初引入的扩展。因此dataString[i]undefined在旧版浏览器上使用,包括 IE<8。

要正确访问字符串中的字符,您应该使用charAt.

出于同样的原因,for...in字符串不会遍历所有浏览器中的索引。

即使它这样做了,使用它也是错误的,因为for...in它用于枚举Object( {}) 映射中的属性,而不是迭代序列。for...in不应在Arrayor上使用,String因为您将获得该实例的所有成员,而不仅仅是数字索引的成员,并且不能保证您会以任何特定顺序获得它们。

ForArrayString正确的循环是老式for i循环。var即使它是全局变量,您也应该使用它。

document.write(' This is a test ... <br/>');
for (var i= 0; i<dataString.length; i++) {
    document.write('<br/> +'+dataString.charAt(i)+': ');
    for (var k= 0; k<dataString.length; k++) {
        document.write(' ='+dataString.charAt(k)+', ');
    }
}

(*:嗯...不是在 ECMAScript 第三版中。新的第五版声明字符串具有“数组索引名称”,这可能是对该功能的认可。似乎有点不清楚)

于 2010-10-12T19:58:55.583 回答
1

根据 W3C:

for...in 语句循环遍历数组的元素或对象的属性。

您的 dataString 作为一种string类型,仅此而已,您拥有的结果在每个浏览器上的解释都不同。

  • IE:dataString 不是对象:>“我不循环”(不明显,数据类型不匹配)
  • FF : dataString 是 ??? :“我迭代每个字符,两者并结合它”(非常明显)
  • Chrome:dataString 是一个字符数组:“我迭代每个字符”。(不明显,因为字符串可以被视为字符数组,但仍然......)

很明显,但仍然正常。

于 2010-10-12T19:06:34.070 回答