Answer
JavaScript testFor..in итерируется по всем полям объекта [b]и его прототипов[/b] (т.е. проходит по всей цепочке прототипов).
В приведённом в вопросе коде проблем как таковых нет, но они могут появиться при использовании библиотек/полифиллов, которые переопределяют или создают новые свойства для прототипов стандартных конструкторов (таких как Array или Object).
Пример:var arr = [3, 4, 5];
Array.prototype.each = function() {/*some fancy polyfill*/};
for (var i in arr) {
console.log(i);
}
Выведет0
1
2
each
Чтобы избежать таких проблем, можно воспользоваться методом Object.prototype.hasOwnProperty.
Модифицированный пример, который работает корректно:
var arr = [3, 4, 5];
Array.prototype.each = function() {/*some fancy polyfill*/};
for (var i in arr) {
if (arr.hasOwnProperty(i)){
console.log(i);
}
}
Примечание:
Многие инструменты для статического анализа JavaScript кода считают for .. in без фильтрации с hasOwnProperty не безопасным.