Я добавляю полиграфию Array.indexOf() в основной файл JavaScript нашего проекта. Я взял его из devdocs.io:Как я могу предотвратить перечисление полиполков в JavaScript?
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (searchElement , fromIndex) {
var i,
pivot = (fromIndex) ? fromIndex : 0,
length;
if (!this) {
throw new TypeError();
}
length = this.length;
if (length === 0 || pivot >= length) {
return -1;
}
if (pivot < 0) {
pivot = length - Math.abs(pivot);
}
for (i = pivot; i < length; i++) {
if (this[i] === searchElement) {
return i;
}
}
return -1;
};
}
мне это нужно, потому что мы по-прежнему должны поддерживать IE 8, но мне кажется, что в IE 8, функция IndexOf() добавляется перечислим. Это означает, что она появляется при переборе над массивами с помощью for..in петли, как это:
var a = [];
a[0]=123;
a[1]=456;
for(var value in a) {
alert(value); // this even alerts "indexOf", if the polyfill above is loaded, and this is a big problem
}
Можно ли сделать polyfill «unenumerable», так что я могу использовать Array.indexOf() в IE 8, но он не появляется в цикле ... в петлях?
Я думаю, что ... в ... это не очень хорошая идея с массивами: http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-such -a-bad-idea –
Решение здесь состоит в том, чтобы прекратить использование 'for ... in' для итерации массива. Вместо этого используйте простой цикл 'for'. –
Я не могу изменить тот факт, что в нашем коде есть сотни для ... циклов над массивами. Было бы огромной работой по их изменению. Полипол, хотя, не был в коде так долго, и было бы относительно легко удалить его ... Если нет другого пути, мне придется это сделать. –