С помощью методов объекта Array вы можете изменять содержимое Array, но по сравнению с базовым циклом for эти методы лишены одной важной функциональности. Вы не можете изменить индекс на ходу.
Например, если вы удалите текущий элемент и поместите его в другую позицию индекса в том же массиве, вы можете легко это сделать. Если вы переместите текущий элемент на предыдущую позицию, в следующей итерации проблем не будет, вы получите тот же следующий элемент, как если бы вы ничего не делали.
Рассмотрим этот код, в котором мы перемещаем элемент в позиции индекса 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 ожидается, что значение индекса будет уменьшаться при перемещении элемента массива вперед, чтобы ваш индекс оставался на той же позиции в следующем цикле, и вы все равно сможете оценить смещение элемента на место удаленного элемента. Это невозможно с помощью методов массива. Вы не можете изменить индекс. Проверьте следующий код
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, с которого он был оставлен.
Так что имейте это в виду.