Array.splice () - это деструктивная операция, которая изменяет длину массива. Это хорошо видно, если вы добавите оператор console.log в ваш средний для цикла:
for (var k = 0; k < matching.length; k++) {
for (var i in dataArray) {
console.log(dataArray, i, k, dataArray[i].split('')[k], matching.split('')[k]);
if (dataArray[i].split('')[k] != matching.split('')[k]) {
dataArray.splice(i,1);
}
}
}
Вывод должен выглядеть примерно так:
["jokes", "jokeg", "jokef"] 0 0 j j
["jokes", "jokeg", "jokef"] 1 0 j j
["jokes", "jokeg", "jokef"] 2 0 j j
["jokes", "jokeg", "jokef"] 0 1 o o
["jokes", "jokeg", "jokef"] 1 1 o o
["jokes", "jokeg", "jokef"] 2 1 o o
["jokes", "jokeg", "jokef"] 0 2 k k
["jokes", "jokeg", "jokef"] 1 2 k k
["jokes", "jokeg", "jokef"] 2 2 k k
["jokes", "jokeg", "jokef"] 0 3 e e
["jokes", "jokeg", "jokef"] 1 3 e e
["jokes", "jokeg", "jokef"] 2 3 e e
["jokes", "jokeg", "jokef"] 0 4 s s
["jokes", "jokeg", "jokef"] 1 4 g s
Он никогда не доходит до 'f' в "jokef", потому что он склеивает массив. match.length теперь 2 , а условие для (var k = 0; k false , что приводит к разрыву цикла и движку JavaScript для перехода к следующему блоку.