JavaScript: для циклов в итерации по свойствам или индексам?

Только начал изучать Javascript. Недавно я использовал циклы for-in для итерации по свойствам объекта. Например...

var someObject = { a:1, b:2 };

for(var property in someObject){
    console.log(property);
}

Это напечатало бы...

"a"
"b"

Тем не менее, когда я использую его для перебора массива...

var someArray = ["a","b","c"];

for(var element in someObject){
    console.log(element);
}

Индексы, а не элементы, печатаются...

"0"
"1"
"2"

Почему это так? Как правило, циклы JS for-in печатают свойства только при переборе объектов и индексов для всего остального?

Если он печатает индексы, за исключением объектов, зачем вообще использовать классический цикл for, такой как

for(var i=0,i<someNumber,i++)

когда можно просто использовать цикл for? Тем более, что это кажется намного более кратким?

for(var i in something)

Я даже должен использовать циклы for-in для чего-либо, кроме объектов?

Спасибо!

1 ответ

Цитирование из https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in#Description

for..in не должен использоваться для перебора массива, где важен порядок индекса. Индексы массива являются просто перечисляемыми свойствами с целочисленными именами и в остальном идентичны общим свойствам объекта. Нет гарантии, что for... in вернет индексы в любом конкретном порядке и вернет все перечислимые свойства, включая свойства с нецелыми именами и наследуемые.

Поскольку порядок итераций зависит от реализации, итерации по массиву могут не посещать элементы в согласованном порядке. Поэтому лучше использовать цикл for с числовым индексом (или Array.forEach или нестандартный цикл for...) при итерации по массивам, где важен порядок доступа.

Итак, не надейтесь на for..in для перебора массива.

И ответить

Индексы, а не элементы, печатаются... Почему это так?

Ответ уже цитировался выше.

Индексы массива являются просто перечисляемыми свойствами с целочисленными именами и в остальном идентичны общим свойствам объекта.

Чтобы подтвердить этот факт, попробуйте следующий пример кода

var myArray = ["A", "B", "C"];
for (var i = 0; i < 3; i += 1) {
    console.log(myArray.hasOwnProperty(i));   // will print true
}

Поэтому for..in также работает с массивами.

Другие вопросы по тегам