Подтвердить что ты не робот

Оператор JavaScript в '`для элементов` undefined `в массивах

Обратите внимание на следующий фрагмент кода:

> a = [1, undefined, undefined, undefined, 3]
  [1, undefined, undefined, undefined, 3]
> b = [1,,,,3]
  [1, undefined × 3, 3]
> 1 in a
  true
> 1 in b
  false

Я что-то упустил? Похоже, что в зависимости от того, как я определяю элементы undefined в массиве, оператор in ведет себя по-разному.

4b9b3361

Ответ 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

Ответ 2

В вашем примере определен параметр [1], но он установлен на undefined, поэтому 1 in a == true. Напротив, b [1] не устанавливается вообще, поэтому 1 in b == false. Вот почему некоторые люди говорят, что undefined странно.

Чтобы проверить, имеет ли массив a значение 1, используйте a.indexOf(1) != -1.

Чтобы проверить, определен ли a[1], используйте a.hasOwnProperty("1") (1 in a, немного отличается и, вероятно, не является тем, что вы хотите, потому что это может быть правдой, если 1 определен в прототипе a но не в a).

Чтобы установить a[1] в undefined, используйте a[1] = undefined.

Чтобы сделать ограничение a[1] прекрасным, используйте delete a[1].

Ответ 3

//-1 means not in the list
//['a','b','c'].indexOf('a') is return index if not find in the list then it give -1.

if(['a','b','c'].indexOf('d') == -1)
{
    console.log('yes it -1')
}