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

javascript:对于(str中的i),在ff之外嵌套的奇怪结果?

  •  2
  • Incognito  · 技术社区  · 14 年前

    我现在很困惑,有人能给我解释一下吗?也许这是我不知道的小事情,但我很困惑为什么这不是我所期望的结果。

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

    Sample 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] +", ");
        }
    }
    ​
    

    现在,我的结果是 是:

    This is a test ... 
    
    +a: 
    +b: 
    

    火狐 是:(这是我期望的结果)

    This is a test ... 
    
    +a: =a, =b, =c, 
    +b: =a, =b, =c, 
    +c: =a, =b, =c, 
    

    结果在 IE8 是:

    This is a test ... 
    

    有人能告诉我这里发生了什么事吗?我错过了什么重要的事情吗?

    注: 您可以使用 "abc".split("") 按照 this example ,请记住,这不再是字符串,现在如果输出它,它将作为数组输出。 a,b,c

    2 回复  |  直到 14 年前
        1
  •  3
  •   bobince    14 年前
    for (i in dataString ) {
        document.write("<br/> +" + dataString[i] + ": ")
    

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

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

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

    即使是这样,使用它也是错误的,因为 为了…… 用于枚举 Object ( {} 地图, 迭代序列。 为了…… 不应用于 Array String 因为您将获得该实例的所有成员,而不仅仅是数字索引成员,而且不能保证您将以任何特定的顺序获得这些成员。

    为了 数组 正确的循环是老派 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第三版中。新的第五版声明字符串具有数组索引名,这可能是对该特性的认可。似乎有点不清楚)

        2
  •  1
  •   Arnaud F.    14 年前

    根据W3C:

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

    您的数据字符串 string 输入而不是其他内容,您所得到的结果在每个浏览器上都会有不同的解释。

    • ie:datastring不是对象:> “I don't loop”(不明显,数据类型不匹配)
    • FF: 数据字符串是????我重复 每一个角色,都要结合起来(非常明显)
    • chrome:datastring是 字符:“我迭代每一个 字符“。(不明显,因为字符串可以被视为字符数组,但仍然是…)

    很明显,但仍然正常。