Вы бы использовали оператор in
или метод hasOwnProperty
:
const has = [1, 2, /*empty slot*/, 4, undefined, 6, /*empty slot*/];
console.log(2 in has); // No property called 2
console.log(has.hasOwnProperty(2)); // No property called 2
console.log(4 in has); // There is one called 4
console.log(has.hasOwnProperty(4)); // There is one called 4
in
проверяет объект и его прототипы на наличие свойства. hasOwnProperty
просто проверяет сам объект, а не его прототипы. Поскольку Array.prototype
не имеет никаких свойств с именами, такими как 2 и 4, определенных (и никогда не будет), либо работает. (Один будет быстрее другого, но который может варьироваться от движка JavaScript к движку JavaScript, и вряд ли это все равно будет иметь значение ...)
Они определены в терминах объектов, а не конкретно массивов, но вы можете использовать их здесь, потому что стандартные массивы в JavaScript являются объектами, они просто предоставляют особую обработку классу свойств (именам, чьи имена являются строками в форме, определенной для индексов массива (см. spec ]), специальным свойством length
и наследуемым от Array.prototype
. Больше в моем блоге Миф о массивах .
Если вы хотите найти следующую пустую ячейку с индексом n
, тогда:
var emptySlot = -1;
while (n < array.length) {
if (!(n in array)) { // or `if (!array.hasOwnProperty(n)) {`
emptySlot = n;
break;
}
++n;
}