То, что вы получаете, - это ожидаемое поведение, и хотя это не настоящий бесконечный цикл - это непроизводительный цикл.
Вы добавляете элемент перед текущим индексом. Это приводит к смещению текущего значения, поэтому вы начнете получать x == 3 на каждой итерации.
Это все помещения для бесконечного цикла, однако JS forEach накладывает на него потолок, а этот потолок представляет собой количество элементов, присутствующих в вашем исходном массиве. Независимо от того, как вы манипулируете массивом, он не может работать более 8 раз, что является исходной длиной.
Вывод этого кода показывает лучшее, что происходит:
var A = [0, 1, 2, 3, 4, 5, 6, 7]
A.forEach(function(x, index) {
document.writeln('A[' + index + '] = ' + x + '<br/>');
if (x == 3) {
A.splice(1, 0, 'new')
}
})
document.write(JSON.stringify(A));
Выход:
A[0] = 0
A[1] = 1
A[2] = 2
A[3] = 3
A[4] = 3
A[5] = 3
A[6] = 3
A[7] = 3
[0,"new","new","new","new","new",1,2,3,4,5,6,7]
алгоритм 'Array.forEach' доступен в [спецификация языка] (http://www.ecma-international.org/ecma-262/5.1/# втор-15.4.4.18). (Или, чтобы увидеть это в JS, проверьте [polyfill at MDN] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill).) – nnnnnn