Это потому, что оператор for-in
перечисляет свойства объекта, включая унаследованные.
Это одна из причин, по которой использование оператора for-in
с массивами или массивоподобных объектов считается плохой практикой.
Другие причины включают то, что порядок перечисления не гарантируется спецификацией, это означает, что свойства индекса могут не посещаться в числовом порядке, например:
var a = [];
a[1] = 'b';
a[0] = 'a'
for (var prop in a) { console.log(i); }
Большинство браузеров обнаружат, что вы пытаетесь перебрать по массиву, и свойства будут посещаться в числовом порядке, но в IE свойства будут перечислены в порядке их создания, 1
, а затем 0
.
Также известно, что оператор for-in
может быть медленнее, чем простой последовательный цикл, потому что, как вы теперь знаете, ему необходимо проанализировать всю цепочку прототипов объекта, чтобы перечислить унаследованные члены.
В качестве общей рекомендации всегда используйте последовательный цикл для итерации объектов такого типа.
Смотри также: