Почему JavaScript «длина в массиве» дает разный результат для массивов, содержащих один или несколько элементов?

#javascript #arrays

#javascript #массивы

Вопрос:

В Chrome 87 length in array выдает следующий вывод:

 length in ['test']
false
 

но если мы попробуем с большим количеством элементов, он выдает следующее:

 length in ['test', 'test2']
true
 

Может кто-нибудь объяснить эти разные результаты?

Комментарии:

1. Каково значение length ?

Ответ №1:

Используемое length вами значение относится не к 'length' свойству, а к значению, содержащемуся в глобальном идентификаторе length , который существует на window . window.length это, согласно MDN:

Возвращает количество фреймов (либо <frame> элементов, либо <iframe> элементов) в окне.

Итак, ваш код выдаст этот результат, если у вас есть ровно 1 фрейм или iframe в окне — поскольку второй массив имеет [1] свойство, но первый массив не имеет [1] свойства.

Живой фрагмент, иллюстрирующий это:

 // NOTE THE EXISTENCE OF ONE IFRAME in the HTML

console.log(length in ['test']);
console.log(length in ['test', 'test2']); 
 <iframe></iframe> 

Аналогично:

 const length = 3;
console.log(
  length in [0, 1, 2, 3, 4, 5] // true; more than 3 items
);
console.log(
  length in [0, 1] // false; less than 3 items
); 

Ответ №2:

length в ваших фрагментах есть переменная, которая, как я полагаю, определена где-то еще и имеет некоторое значение. В зависимости от его значения length in [0, 1] может возвращать true или false . Поскольку вы упомянули Chrome, я предполагаю, что вы используете этот фрагмент в chrome dev tools. В данном случае length это глобальная переменная (на самом деле, это свойство window: window.length ). Проверьте его значение — это, вероятно 1 . Это объясняет, почему 1 in ['test'] значение равно false (здесь нет элемента с индексом 1 ), но 1 in ['test1', 'test2'] равно true.

Если вы хотите проверить наличие свойства «длина», вам нужно иметь его в виде строки:

 'length' in []
 

В этом случае он будет возвращаться true для любого массива — потому что все массивы имеют свойство «length»