Каждый не отвечает прямо на ваш вопрос и продолжает ссылаться на длину.
Ваш код:
function filterNumbers(arr) {
for (var i = 0; i < arr.length; i++) {
if(typeof arr[i] !== 'number') {
arr.splice(i, 1);
}
}
}
Проблема в том, на что i
ссылается (что играет роль с длиной, но они не объясняют дальше). Когда i
равен 1, вы ссылаетесь на a
вашего массива. Затем вы склеиваете его из массива, который теперь делает 1 ссылку «b». Это все еще в цикле for до завершения его итерации. Затем вы увеличиваете i
с 1 (который ссылается на b
сейчас) до 2, который затем ссылается на 2
в вашем массиве.
Вы можете проверить это дальше, сделав в вашем массиве все буквы, и вы увидите, как пропустите все остальные буквы (['a', 'b', 'c', 'd', 'e', 'f']
приведет к ['b', 'd', 'f']
).
Чтобы обойти проблему, вам придется увеличить / уменьшить i
в зависимости от того, что вы делаете внутри цикла. Если вы склеиваете, уменьшаете i
или добавляете оператор else в цикле и увеличиваете значение i
внутри оператора else, а не после каждой итерации.