JavaScript «Обнаружение <N пустого слота> не определено» - PullRequest
0 голосов
/ 05 июля 2018

Как обнаружить «пустой слот» в массиве? «Пустое место» не «неопределено»!

<script type="text/javascript">
    const has = [1, 2, /*empty slot*/, 4, undefined, 6, /*empty slot*/];
    console.log(has[2] === undefined); // true - but, is <empty slot>!!!
    console.log(has[4] === undefined); // true - needle.
</script>

Спасибо!)

1 Ответ

0 голосов
/ 05 июля 2018

Вы бы использовали оператор 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...