За допомогою об'єктних методів Array ви можете змінити вміст масиву ще порівняно з базовим для циклів, ці методи не мають однієї важливої функціональності. Ви не можете змінювати індекс під час пробігу.
Наприклад, якщо ви видалите поточний елемент і помістите його в іншу позицію індексу в тому ж масиві, ви можете це легко зробити. Якщо ви перемістите поточний елемент у попереднє положення, у наступній ітерації не виникає проблем, ви отримаєте такий самий наступний елемент, як ніби нічого не зробили.
Розглянемо цей код, коли ми переміщуємо елемент у позиції індексу 5 до позиції індексу 2, коли індекс налічує до 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
Однак якщо ми перемістимо поточний елемент кудись за межі поточної позиції індексу, дещо стає безладним. Тоді вже наступний елемент зміститься у положення переміщених елементів, і в наступній ітерації ми не зможемо його побачити чи оцінити.
Розглянемо цей код, коли ми переміщуємо елемент у позиції індексу 5 до позиції індексу 7, коли індекс налічує до 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
Таким чином, ми ніколи не зустрічали 6 в циклі. Зазвичай у циклі for for ви очікуєте зменшення значення індексу, коли ви переміщуєте елемент масиву вперед, щоб ваш індекс залишався на тому ж самому положенні в наступному запуску, і ви все ще можете оцінити елемент, переміщений на місце видаленого елемента. Це неможливо з методами масиву. Ви не можете змінити індекс. Перевірте наступний код
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
Як ви бачите, коли ми декрементуємо, i
він продовжиться не з 5, а з 6, звідки він був залишений.
Тому майте це на увазі.