J'ai trouvé l'annotation de boucle suivante dans un grand projet sur lequel je travaille (pseudocode):
var someOtherArray = [];
for (var i = 0, n = array.length; i < n; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
Ce qui a attiré mon attention, c'est cette variable "n" supplémentaire. Je n'ai jamais vu un for lop écrit de cette façon auparavant.
Évidemment, dans ce scénario, il n'y a aucune raison pour que ce code ne puisse pas être écrit de la manière suivante (ce à quoi je suis très habitué):
var someOtherArray = [];
for (var i = 0; i < array.length; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
Mais il m'a fait réfléchir.
Existe-t-il un scénario où l'écriture d'une telle boucle serait logique? L'idée vient à l'esprit que la longueur du "tableau" peut changer pendant l'exécution de la boucle for, mais nous ne voulons pas boucler plus loin que la taille d'origine, mais je ne peux pas imaginer un tel scénario.
Réduire le tableau à l'intérieur de la boucle n'a pas beaucoup de sens non plus, car nous sommes susceptibles d'obtenir OutOfBoundsException.
Existe-t-il un modèle de conception connu où cette annotation est utile?
Modifier Comme indiqué par @ Jerry101, la raison en est la performance. Voici un lien vers le test de performance que j'ai créé: http://jsperf.com/ninforloop . À mon avis, la différence n'est pas assez grande à moins que vous ne répétiez à travers un très large éventail. Le code à partir duquel je l'ai copié ne comportait que jusqu'à 20 éléments, donc je pense que la lisibilité dans ce cas l'emporte sur la considération des performances.
n
peut être plus lente que la variante using array.Length
car le JITter peut ne pas remarquer qu'il pourrait éliminer les vérifications des limites du tableau.