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
также работает с массивами.