Với các phương thức đối tượng Array, bạn có thể sửa đổi nội dung Array so với cơ sở cho các vòng lặp, các phương thức này thiếu một chức năng quan trọng. Bạn không thể sửa đổi chỉ mục khi chạy.
Ví dụ: nếu bạn sẽ loại bỏ phần tử hiện tại và đặt nó vào vị trí chỉ mục khác trong cùng một mảng, bạn có thể dễ dàng thực hiện việc này. Nếu bạn di chuyển phần tử hiện tại sang vị trí trước đó, không có vấn đề gì trong lần lặp tiếp theo, bạn sẽ nhận được mục tiếp theo giống như khi bạn chưa làm gì cả.
Xem xét mã này nơi chúng tôi di chuyển mục ở vị trí chỉ mục 5 đến vị trí chỉ mục 2 khi chỉ mục đếm đến 5.
var ar = [0,1,2,3,4,5,6,7,8,9];
ar.forEach((e,i,a) => {
i == 5 && a.splice(2,0,a.splice(i,1)[0])
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9
Tuy nhiên, nếu chúng ta di chuyển phần tử hiện tại đến một nơi nào đó ngoài vị trí chỉ mục hiện tại, mọi thứ sẽ hơi lộn xộn. Sau đó, mục tiếp theo sẽ chuyển sang vị trí mục được di chuyển và trong lần lặp tiếp theo, chúng tôi sẽ không thể xem hoặc đánh giá nó.
Xem xét mã này nơi chúng tôi di chuyển mục ở vị trí chỉ mục 5 đến vị trí chỉ mục 7 khi chỉ mục đếm đến 5.
var a = [0,1,2,3,4,5,6,7,8,9];
a.forEach((e,i,a) => {
i == 5 && a.splice(7,0,a.splice(i,1)[0])
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 7 - 7 5 - 8 8 - 9 9
Vì vậy, chúng tôi chưa bao giờ gặp 6 trong vòng lặp. Thông thường trong một vòng lặp for, bạn dự kiến sẽ giảm giá trị chỉ mục khi bạn di chuyển mục mảng về phía trước để chỉ mục của bạn giữ nguyên vị trí trong lần chạy tiếp theo và bạn vẫn có thể đánh giá mục được chuyển vào vị trí của mục bị xóa. Điều này là không thể với các phương thức mảng. Bạn không thể thay đổi chỉ mục. Kiểm tra mã sau
var a = [0,1,2,3,4,5,6,7,8,9];
a.forEach((e,i,a) => {
i == 5 && (a.splice(7,0,a.splice(i,1)[0]), i--);
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 4 5 - 6 7 - 7 5 - 8 8 - 9 9
Như bạn thấy khi chúng tôi giảm giá, i
nó sẽ không tiếp tục từ 5 mà là 6, từ nơi nó được để lại.
Vì vậy, hãy ghi nhớ điều này.