2010-10-12 20 views
2

我現在很困惑,有人可以向我解釋這一個嗎?也許這是我不知道的小事,但我很困惑,爲什麼這不是我所期望的。javascript:for(我在str中),嵌套的,奇怪的結果在FF之外?

我創建了一個樣本,以顯示我看到的問題......

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: 

FireFox是:(這是我預期的結果)

This is a test ... 

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

結果IE8是:

This is a test ... 

任何人都可以向我解釋這裏發生了什麼?我錯過了關鍵的東西嗎?

注: 可以轉換字符串跨使用按this example瀏覽器陣列,只記得這不再是一個字符串,而現在,如果你將它輸出,這將是輸出根據陣列a,b,c

回答

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不應在ArrayString上使用,因爲您將獲得該實例的所有成員,而不僅僅是數字索引的成員,並且不能保證以任何特定順序得到它們。

對於ArrayString正確的循環是老派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的第三版新的第五版指出字符串有「數組索引名」,這可能是該功能的認可似乎有點不清楚。)

1

到W3C:

for ... in聲明循環遍歷數組的元素或通過對象的屬性。

您的dataString作爲string類型而沒有其他任何東西,您的結果在每個瀏覽器上的解釋都是不同的。

  • IE:dataString不是一個對象:> 「我不循環」(不是很明顯,數據類型不匹配)
  • FF: dataString是??? :「我重複了 每個字符,兩者並結合它」(非常明顯)
  • Chrome:dataString是一個數組 字符:「我迭代每個 字符」。 (不明顯,因爲一個字符串可以被視爲字符數組,但仍然...)

明顯但仍然正常。

+0

有意思的是,如果dataString存儲這樣的值,它可以全部解決:'var dataString = [「a」,「b」,「c」];' – Incognito 2010-10-12 19:11:16

+1

@ user257493:您也可以使用'var dataString =「 ABC」 .split( 「」)' – 2010-10-12 19:16:02