Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Tại sao không nên dùng for...in với Array trong JavaScript

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/await
  • arr.forEach(cb) — functional
  • arr.map/filter/reduce... — transformation