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によって導入された拡張機能です。その結果、IE<8を含む古いブラウザdataString[i]になります。undefined

文字列内の文字に正しくアクセスするには、を使用する必要がありますcharAt

同じ理由でfor...in、文字列を超えると、すべてのブラウザのインデックスが繰り返されるわけではありません。

そして、たとえそうだったとしても、それを使用するのは間違っているでしょう。なぜなら、シーケンスを反復するのではなく、 ()マップfor...inのプロパティを列挙するためだからです。またはで使用しないでください。数値インデックスのメンバーだけでなく、そのインスタンスのすべてのメンバーを取得するため、特定の順序で取得する保証はありません。Object{}for...inArrayString

正しいループは昔ながらのループArrayです。また、グローバル変数であっても使用する必要があります。Stringfor ivar

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第3版にはありません。新しい第5版では、文字列には「配列インデックス名」があると記載されています。これは、この機能を推奨している可能性があります。少し不明確なようです)

于 2010-10-12T19:58:55.583 に答える
1

W3Cによると:

for ... inステートメントは、配列の要素またはオブジェクトのプロパティをループします。

dataStringはstringタイプであり、他には何もありません。結果は、ブラウザーごとに異なる方法で解釈されます。

  • IE:dataStringはオブジェクトではありません:>「ループしません」(明らかではありません、データ型が一致しません)
  • FF:dataStringは??? :「私は各文字を繰り返し、両方を組み合わせて組み合わせます」(非常に明白です)
  • Chrome:dataStringは文字の配列です:"各文字を繰り返し処理します"。(文字列は文字配列と見なすことができるため明らかではありませんが、それでも...)

明らかですが、それでも正常です。

于 2010-10-12T19:06:34.070 に答える