Maison > interface Web > js tutoriel > le corps du texte

Pourquoi le tableau est-il préféré dans la collection ordonnée cyclique de Javascript ?

伊谢尔伦
Libérer: 2018-05-16 17:15:46
original
2299 Les gens l'ont consulté

Préférez utiliser des tableaux plutôt que des types d'objet pour représenter des collections ordonnées

La norme ECMAScript ne spécifie pas l'ordre de stockage des propriétés dans le type d'objet de JavaScript.

Mais lorsque vous utilisez une boucle for..in pour parcourir les propriétés dans Object, vous devez vous fier à un certain ordre. Précisément parce qu'ECMAScript ne standardise pas explicitement cette séquence, chaque moteur d'exécution JavaScript peut être implémenté selon ses propres caractéristiques, de sorte que la cohérence comportementale de la boucle for..in ne peut pas être garantie dans différents environnements d'exécution.

Par exemple, le résultat du code suivant lors de l'appel de la méthode report est incertain :

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 }]); 
// ?
Copier après la connexion

Si vous avez vraiment besoin de vous assurer que le résultat de l'exécution est basé sur l'ordre des données , utilisez d'abord un type de tableau pour représenter les données au lieu d'utiliser directement le type Object. En même temps, essayez d'éviter d'utiliser des boucles for..in et d'utiliser des boucles for explicites :

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"
Copier après la connexion

Un autre comportement particulièrement dépendant de l'ordre est le calcul de nombres à virgule flottante :

var ratings = { 
  "Good Will Hunting": 0.8, 
  "Mystic River": 0.7, 
  "21": 0.6, 
  "Doubt": 0.9 
};
Copier après la connexion

Au point 2, il est mentionné que l'opération d'addition de nombres à virgule flottante ne peut même pas satisfaire la loi commutative : Les résultats de
(0,1 + 0,2) + 0,3 et les résultats de 0,1 + (0,2 + 0,3) sont
0,6000000000000001 et 0,6 respectivement

Donc pour les opérations arithmétiques sur les nombres à virgule flottante, un ordre arbitraire ne peut pas être utilisé :

var total = 0, count = 0; 
for (var key in ratings) { // unpredictable order 
  total += ratings[key]; 
  count++; 
} 
total /= count; 
total; // ?
Copier après la connexion

Lorsque l'ordre de parcours de for..in est différent, le résultat total final est C'est différent. Voici les deux ordres de calcul et leurs résultats correspondants :

(0.8 + 0.7 + 0.6 +0.9) / 4 // 0.75
(0.6 + 0.8 + 0.7 +0.9) / 4 // 0.7499999999999999
Copier après la connexion

Bien entendu, pour des problèmes tels que les calculs en virgule flottante, une solution consiste à utiliser des nombres entiers pour les représenter. , tel que Nous agrandissons d'abord le nombre à virgule flottante ci-dessus 10 fois en données entières, puis le réduisons 10 fois une fois le calcul terminé :

(8+ 7 + 6 + 9) / 4 / 10  // 0.75
(6+ 8 + 7 + 9) / 4 / 10  // 0.75
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal