How to tell between undefined array elements and empty slots?

You can use the in operator to check if the array has a key. It will return false for empty slots, but true for slots with values, including the value undefined:

var arr = new Array(3);
arr[0] = null;
arr[1] = undefined;

1 in arr; // true
2 in arr; // false

Note that you can't distinguish between empty slots and slots past the end of the array using that, but if you know the length of the array, then you already know that 3 isn't part of it, so you don't need to test 3 in arr.

You can also filter out the empty slots like this:

arr = arr.filter( ( _, i ) => i in arr );

You could use Array#forEach, which omits sparse elements.

var arr = new Array(3);
arr[0] = null;
arr[1] = undefined;
console.log(arr); 

var withoutSparse = [];

arr.forEach(function (a, i) {
    console.log(i);
    withoutSparse.push(a);
});
console.log(withoutSparse);
.as-console-wrapper { max-height: 100% !important; top: 0; }