J'ai été surpris de pouvoir reproduire un bug avec un minimum de code. Notez que dans cet exemple minimaliste, Array.indexOf n'est pas appelé. Notez également que j'ai essayé plusieurs implémentations différentes d'indexOf, dont plusieurs de stackoverflow.com.Quelle est la cause de cette erreur avec for ... in après l'affectation de Array.prototype.indexOf?
Le bug est, lorsque le for ... in s'exécute dans IE, trois alertes sont affichées: "indexOf", "0" et "1". En FF, comme on pouvait s'y attendre, seulement deux ("0", "1") apparaissent.
<html>
<body onLoad="test();">
<script language="javascript">
var testArray = ['Foo', 'Bar'];
if(!Array.prototype.indexOf) {
Array.prototype.indexOf = function (obj, fromIndex) {
if (fromIndex == null) {
fromIndex = 0;
} else if (fromIndex < 0) {
fromIndex = Math.max(0, this.length + fromIndex);
}
for (var i = fromIndex, j = this.length; i < j; i++) {
if (this[i] === obj)
return i;
}
return -1;
};
}
function test() {
var i;
for(i in testArray) {
alert(i);
}
}
</script>
</body>
</html>
Quelqu'un peut-il expliquer cela? J'ai déjà changé mon code pour utiliser un while
donc je ne suis pas sous le feu, mais celui-ci m'a vraiment perplexe. Cela me rappelle des erreurs de dépassement de mémoire dans c.
Merci beaucoup; c'est exactement ce dont j'avais besoin. – overslacked
Vous ne devriez vraiment pas utiliser pour ... sur des tableaux du tout. Voir le lien dans ma réponse. – nickf
@Steve: Comme il n'y a rien de cassé, je n'appellerais pas en utilisant "hasOwnProperty()" un correctif. ;-) – Tomalak