Ответ 1
Массивы - это не что иное, как обычные объекты JavaScript, с некоторой специализацией. Цитата из раздела Array Objects спецификации ECMA 5.1
Объекты массива предоставляют особый подход к определенному классу имен свойств. Имя свойства P (в виде значения String) является индексом массива тогда и только тогда, когда ToString (ToUint32 (P)) равно P и ToUint32 (P) не равно 2 32 -1.
Итак, индексы массива - это ничего, кроме свойств объектов массива. Теперь давайте посмотрим на отсутствующие элементы в массиве.
Цитата из Стандартная спецификация ECMA 5.1,
Элементы массива могут быть удалены в начале, середине или конце список элементов. Всякий раз, когда запятая в списке элементов не предшествует Выделение присвоения (т.е. запятая в начале или после другая запятая), недостающий элемент массива вносит вклад в длину Массив и увеличивает индекс последующих элементов. Элитный массив элементы не определены. Если элемент заканчивается в конце массив, этот элемент не вносит вклад в длину массива.
Итак, когда вы говорите
b = [1,,,,3];
за исключением элементов 1 и 3, все остальные рассматриваются как отсутствующие элементы в массиве. Теперь элементы 1
и 3
соответствуют свойствам 0
и 4
(индексы Array начинаются с 0
в JavaScript).
Вы можете проверить, что вот так
console.log(Object.getOwnPropertyNames(b));
# [ '0', '4', 'length' ]
console.log(Object.getOwnPropertyNames(a));
# [ '0', '1', '2', '3', '4', 'length' ]
Только индексы 0
и 4
находятся в b
. Возможно, вам интересно, почему a
имеет свойства от 0
до 4
, хотя значения undefined
. Поскольку элементы с индексами 1, 2 и 3 определены как undefined
, где, как и в b
Знают, каковы эти значения. Вот почему они не привязаны к свойству (индексу).
Теперь вы проверяете, находится ли 1
в b
, с оператором in
. Цитирование из in
оператора MDN Doc,
Оператор in возвращает true, если указанное свойство находится в указанном объекте.
Итак, вы в основном проверяете, является ли 1
одним из свойств b
, а это не так. Вот почему '1'
в b
возвращает false
.
Примечание:
Если вы хотите узнать, находится ли 1
в массиве или нет, вы должны использовать Array.prototype.indexOf
, например
console.log(a.indexOf(1));
# 0
console.log(b.indexOf(1));
# 0
console.log(b.indexOf(5));
# -1
Array.prototype.indexOf
возвращает -1
, если искомый элемент отсутствует в массиве. Итак, вы можете сделать что-то вроде этого
console.log(a.indexOf(1) !== -1);
# true
console.log(b.indexOf(1) !== -1);
# true
console.log(a.indexOf(5) !== -1);
# false