Массивы с пустыми слотами называются
sparse arrays. Разные методы массивов
по-разному обходятся с пустыми слотами: более новые их считают
undefined
, старые методы пропускают.
Топорное решение: собрать индексы присутствующих элементов, и сравнить с полным диапазоном индексов:
const arr = [1,2,3,4,5,6,7,8,9];
delete arr[1];
delete arr[3];
delete arr[5];
// arr == [ 1, <1 empty slot>, 3, <1 empty slot>, 5, <1 empty slot>, 7, 8, 9 ]
const present = [];
arr.forEach((_, i) => present.push(i));
// present == [ 0, 2, 4, 6, 7, 8 ]
const empty = Array.from({ length: arr.length }, (_, i) => i) // [0,1,2,3,4,5,6,7,8]
.filter(i => !present.includes(i));
// empty == [ 1, 3, 5 ]