for...in liệt kê **enumerable properties** của object (kể cả inherited prototype chain) — **không phải index tuần tự**.
Ví dụ vấn đề
let arr = []; arr[4] = 5; // sparse array, length = 5 // for loop thường for (let i = 0; i < arr.length; i++) console.log(arr[i]); // undefined, undefined, undefined, undefined, 5 // for...in for (let i in arr) console.log(arr[i]); // 5 (chỉ lặp index có giá trị: "4")
Vấn đề khác
- Duyệt cả property kế thừa từ prototype (nếu ai đó extend
Array.prototype). - Thứ tự không đảm bảo (mặc dù modern engine thường theo index).
- Key là **string** (
"0","1"...) không phải number.
Nên dùng thay thế
for (let i=0; i— classic for (const item of arr)— ES6, clean, hỗ trợ async/awaitarr.forEach(cb)— functionalarr.map/filter/reduce...— transformation