Я был удивлен, когда мне удалось воспроизвести ошибку с минимальным количеством кода. Обратите внимание, что в этом минималистском примере Array.indexOf не вызывается. Также обратите внимание, что я пробовал несколько разных реализаций indexOf, в том числе несколько из stackoverflow.com.
Ошибка заключается в том, что при выполнении for ... in в IE отображаются три предупреждения: «indexOf», «0» и «1». В FF, как и следовало ожидать, появляются только два («0», «1»).
<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>
Может кто-нибудь объяснить это? Я уже изменил свой код, чтобы использовать while
, так что я не под прицелом, но этот действительно поставил меня в тупик. Это напоминает мне об ошибках переполнения памяти в c.