Heim  >  Artikel  >  Web-Frontend  >  Warum wird Array in der zyklisch geordneten Sammlung von Javascript bevorzugt?

Warum wird Array in der zyklisch geordneten Sammlung von Javascript bevorzugt?

伊谢尔伦
伊谢尔伦Original
2018-05-16 17:15:462279Durchsuche

Verwenden Sie lieber Arrays anstelle von Objekttypen, um geordnete Sammlungen darzustellen.

Der ECMAScript-Standard gibt nicht die Speicherreihenfolge von Eigenschaften im Objekttyp von JavaScript an.

Aber wenn Sie eine for..in-Schleife verwenden, um die Eigenschaften in Object zu durchlaufen, müssen Sie sich auf eine bestimmte Reihenfolge verlassen. Gerade weil ECMAScript diese Sequenz nicht explizit standardisiert, kann jede JavaScript-Ausführungs-Engine gemäß ihren eigenen Merkmalen implementiert werden, sodass die Verhaltenskonsistenz der for..in-Schleife in verschiedenen Ausführungsumgebungen nicht garantiert werden kann.

Zum Beispiel ist das Ergebnis des folgenden Codes beim Aufrufen der Berichtsmethode unsicher:

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 }]); 
// ?

Wenn Sie wirklich sicherstellen müssen, dass das laufende Ergebnis auf der Reihenfolge der Daten basiert , verwenden Sie als ersten Typ ein Array, um Daten darzustellen, anstatt den Objekttyp direkt zu verwenden. Vermeiden Sie gleichzeitig die Verwendung von for..in-Schleifen und verwenden Sie explizite for-Schleifen:

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"

Ein weiteres Verhalten, das besonders von der Reihenfolge abhängt, ist die Berechnung von Gleitkommazahlen:

var ratings = { 
  "Good Will Hunting": 0.8, 
  "Mystic River": 0.7, 
  "21": 0.6, 
  "Doubt": 0.9 
};

In Punkt 2 wird erwähnt, dass die Additionsoperation von Gleitkommazahlen nicht einmal das Kommutativgesetz erfüllen kann: Die Ergebnisse von
(0,1 + 0,2) + 0,3 und die Ergebnisse von 0,1 + (0,2 + 0,3) sind
0,600000000000001 bzw. 0,6

Daher kann für arithmetische Operationen mit Gleitkommazahlen keine beliebige Reihenfolge verwendet werden:

var total = 0, count = 0; 
for (var key in ratings) { // unpredictable order 
  total += ratings[key]; 
  count++; 
} 
total /= count; 
total; // ?

Wenn die Durchlaufreihenfolge von for..in unterschiedlich ist, Das endgültige Gesamtergebnis ist unterschiedlich. Im Folgenden sind die beiden Berechnungsreihenfolgen und ihre entsprechenden Ergebnisse aufgeführt:

(0.8 + 0.7 + 0.6 +0.9) / 4 // 0.75
(0.6 + 0.8 + 0.7 +0.9) / 4 // 0.7499999999999999

Für Probleme wie Gleitkommaberechnungen besteht eine Lösung natürlich darin, ganze Zahlen zu verwenden, um sie darzustellen , wie z. B. Wir vergrößern die obige Gleitkommazahl zunächst zehnmal in ganzzahlige Daten und reduzieren sie dann zehnmal, nachdem die Berechnung abgeschlossen ist:

(8+ 7 + 6 + 9) / 4 / 10  // 0.75
(6+ 8 + 7 + 9) / 4 / 10  // 0.75

Das obige ist der detaillierte Inhalt vonWarum wird Array in der zyklisch geordneten Sammlung von Javascript bevorzugt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn