ホームページ > 記事 > ウェブフロントエンド > JavaScript の循環順序付きコレクションで配列が好まれるのはなぜですか?
順序付けられたコレクションを表すには、オブジェクト型の代わりに配列を使用することを推奨します
ECMAScript 標準では、JavaScript のオブジェクト型のプロパティの格納順序を指定していません。
ただし、for..in ループを使用して Object のプロパティを走査する場合は、特定の順序に依存する必要があります。 ECMAScript はこのシーケンスを明示的に標準化していないため、各 JavaScript 実行エンジンは独自の特性に従って実装される可能性があり、異なる実行環境での for..in ループの動作の一貫性は保証できません。
たとえば、report メソッドを呼び出したときの次のコードの結果は不確実です:
function report(highScores) { var result = ""; var i = 1; for (var name in highScores) { // unpredictable order result += i + ". " + name + ": " + highScores[name] + "\n"; i++; } return result; } report([{ name: "Hank", points: 1110100 }, { name: "Steve", points: 1064500 }, { name: "Billy", points: 1050200 }]); // ?
実行結果がデータの順序に基づいていることを本当に確認する必要がある場合は、データを表すために配列型を使用することを優先してください。オブジェクト型を直接使用するのではなく。同時に、for..in ループの使用を避け、明示的な for ループを使用するようにしてください:
function report(highScores) { var result = ""; for (var i = 0, n = highScores.length; i < n; i++) { var score = highScores[i]; result += (i + 1) + ". " + score.name + ": " + score.points + "\n"; } return result; } report([{ name: "Hank", points: 1110100 }, { name: "Steve", points: 1064500 }, { name: "Billy", points: 1050200 }]); // "1. Hank: 1110100 2. Steve: 1064500 3. Billy: 1050200\n"
特に順序に依存するもう 1 つの動作は、浮動小数点数の計算です:
var ratings = { "Good Will Hunting": 0.8, "Mystic River": 0.7, "21": 0.6, "Doubt": 0.9 };
項目 2 では、浮動小数点数について説明しました。小数点数の加算演算は交換法則さえ満たせません:
(0.1 + 0.2) + 0.3 の結果と 0.1 + (0.2 + 0.3) の結果はそれぞれ
0.600000000000001 と 0.6
したがって、浮動小数点数の算術演算の場合任意のものは使用できません。順序:
var total = 0, count = 0; for (var key in ratings) { // unpredictable order total += ratings[key]; count++; } total /= count; total; // ?
for..in の走査順序が異なると、得られる最終的な合計結果も異なります。以下は 2 つの計算順序とそれに対応する結果です:
(0.8 + 0.7 + 0.6 +0.9) / 4 // 0.75 (0.6 + 0.8 + 0.7 +0.9) / 4 // 0.7499999999999999
Of。もちろん、浮動小数点数の場合 この種の計算問題に対する 1 つの解決策は、それを表すために整数を使用することです。たとえば、最初に上記の浮動小数点数を 10 倍に拡大して整数データにし、計算が完了した後にそれを 10 倍に縮小します。 :
りー以上がJavaScript の循環順序付きコレクションで配列が好まれるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。