Хоць масівы ў JavaScript — аб'екты, няма добрых падставаў для таго, каб
выкарыстоўваць цыкл for in для ітэрацыі па масівах.
Фактычна, ёсць шэраг добрых падстаў супраць гэтага.
Заўвага: масівы JavaScript не асацыятыўныя масівы. JavaScript мае аб'екты для структуры ключ-значэнне. Але калі асацыятыўныя масівы захоўваюць парадак, аб'екты — не.
З той прычыны, што цыкл for in пералічвае ўсе ўласцівасці, якія ёсць у ланцужку прататыпаў,
і таму, што адзіны спосаб выключыць гэтыя значэнні — hasOwnProperty,
ітэрацыя атрымліваецца ў 20 разоў марудней за звычайны цыкл for.
Для таго, каб атрымаць найлепшую прадукцыйнасць у ітэрацыі па масіву, лепш
выкарыстаць класічны цыкл for.
var list = [1, 2, 3, 4, 5, ...... 100000000];
for(var i = 0, l = list.length; i < l; i++) {
console.log(list[i]);
}
У вышэйпрыведзеным прыкладзе ёсць яшчэ адзін прыём, з дапамогай якога можна кэшаваць
памер масіва: l = list.length.
Негледзячы на тое, што ўласцівасць length вызначана ў самім масіве, пошук
гэтай уласцівасці накладвае выдаткі на пошук пры кожнай ітэрацыі цыкла. І хоць
новыя рухавікі JavaScript могуць прымяніць аптымізацыю у гэтым выпадку, няма
магчымасці дакладна ведаць, ці будзе код выкананы на гэтых новых рухавіках.
Фактычна, адсутнасць кэшавання можа зрабіць выкананне цыкла ў два разы больш марудным, чым з кэшаваным 'length'.
Хоць гэтэр уласцівасці length проста вяртае колькасць элементаў, што
знаходзяцца у масіве, сэтэр можа быць выкарыстаны для абразання масіва.
var arr = [1, 2, 3, 4, 5, 6];
arr.length = 3;
arr; // [1, 2, 3]
arr.length = 6;
arr.push(4);
arr; // [1, 2, 3, undefined, undefined, undefined, 4]
Прысвойванне ўласцівасці 'length' меншага значэння абразае масіў. Прысваенне большага значэнне створыць разрэджаны масіў.
Для лепшай прадукцыйнасці рэкамендуецца заўсёды выкарыстоўваць звычайны цыкл for,
і кэшаваць уласціваць length. Выкарыстоўванне for in для ітэрацыі па масіву —
прыкмета дрэнна напісанага коду, схільнага да памылак і дрэннай прадукцыйнасці.