Pourquoi pour … obtient toutes les propriétés, mais pour … de ne pas avoir toutes les valeurs?

J'ai testé le code suivant:

arr = [3, 5, 7]; arr.foo = "hello"; arr["boo"] ="moo" for (i in arr) { console.log(i); } for (i of arr) { console.log(i); } 

Pour .. dans obtient toutes les propriétés du tableau.

 for (i in arr) { console.log(i); } 

résultats:

 0 1 2 foo boo 

Mais pour … de ne pas avoir toutes les valeurs

  for (i of arr) { console.log(i); } 

résultats:

 3 5 7 

Quelle est la raison technique de cette différence et pourquoi cette inconsistance apparente a-t-elle été acceptée comme comportement par défaut?

La syntaxe for (... in ...) est disponible pour une utilisation sur n'importe quel objet et iteraie sur toutes les propriétés de cet objet. Plus techniquement, cette boucle iterautera sur toute propriété de l'objet qui est défini en interne avec sa propriété [[Enumerbale]] définie sur true.

La syntaxe de for (... of ...) est nouvelle avec ES6 et est spécifique aux collections plutôt qu'à tous les objets. Il fournit une façon abrégée d'itérer sur les éléments d'une collection, plutôt que d'utiliser une simple ou une boucle avec un index. Il itera de cette manière sur tous les éléments d'une collection qui possède une propriété [Symbol.iterator] .

Ce n'est pas une "incohérence", ils sont deux opérateurs différents destinés à être utilisés à deux fins différentes. Je peux comprendre comment il pourrait sembler faire quelque chose comme arr["boo"] ="moo" ajouterait un élément au tableau – puisque vous pouvez accéder aux éléments du tableau via une syntaxe similaire, comme dans arr[0] . Mais il est facile de confirmer que ce ne sont pas les mêmes en effet – avec arr["boo"] ="moo" vous créez une propriété qui peut également être consultée par arr.boo , mais en essayant d'accéder aux éléments d'un Par exemple, arr.0 serait une erreur de syntaxe, car ils ne sont pas les mêmes que les propriétés.

Vous essayez de traiter le tableau comme s'il s'agissait d'un objet, ou d'un tableau associatif (pas une chose en JavaScript).

C'est un tableau; Les propriétés non entières ne seront jamais des valeurs du tableau, ce qui est for...of vous obtenir.

Vous ajoutez des propriétés bonus à l'objet arr , mais en attendant que la valeur de arr.foo apparaisse dans for..of on serait comme s'attendre à ce que la valeur de arr.length apparaisse.