Немного о «length»
Свойство length
автоматически обновляется при изменении массива. Если быть точными, это не количество элементов массива, а наибольший цифровой индекс плюс один.
Например, единственный элемент, имеющий большой индекс, даёт большую длину:
let fruits = [];
fruits[123] = "Яблоко";
alert( fruits.length ); // 124
Обратите внимание, что обычно мы не используем массивы таким образом.
Ещё один интересный факт о свойстве length
– его можно перезаписать.
Если мы вручную увеличим его, ничего интересного не произойдёт. Зато, если мы уменьшим его, массив станет короче. Этот процесс необратим, как мы можем понять из примера:
let arr = [1, 2, 3, 4, 5];
arr.length = 2; // укорачиваем до двух элементов
alert( arr ); // [1, 2]
arr.length = 5; // возвращаем length как было
alert( arr[3] ); // undefined: значения не восстановились
Таким образом, самый простой способ очистить массив – это arr.length = 0;
.
new Array()
Существует ещё один вариант синтаксиса для создания массива:
let arr = new Array("Яблоко", "Груша", "и тд");
Он редко применяется, так как квадратные скобки []
короче. Кроме того, у него есть хитрая особенность.
Если new Array
вызывается с одним аргументом, который представляет собой число, он создаёт массив без элементов, но с заданной длиной.
Давайте посмотрим, как можно оказать себе медвежью услугу:
let arr = new Array(2); // создастся ли массив [2]?
alert( arr[0] ); // undefined! нет элементов.
alert( arr.length ); // length 2
Как мы видим, в коде, представленном выше, в new Array(number)
все элементы равны undefined
.
Чтобы избежать появления таких неожиданных ситуаций, мы обычно используем квадратные скобки, если, конечно, не знаем точно, что по какой-то причине нужен именно Array
.
Многомерные массивы
Массивы могут содержать элементы, которые тоже являются массивами. Это можно использовать для создания многомерных массивов, например, для хранения матриц:
let matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
alert( matrix[1][1] ); // 5, центральный элемент
toString
Массивы по-своему реализуют метод toString
, который возвращает список элементов, разделённых запятыми.
Например:
let arr = [1, 2, 3];
alert( arr ); // 1,2,3
alert( String(arr) === '1,2,3' ); // true
Давайте теперь попробуем следующее:
alert( [] + 1 ); // "1"
alert( [1] + 1 ); // "11"
alert( [1,2] + 1 ); // "1,21"
Массивы не имеют ни Symbol.toPrimitive
, ни функционирующего valueOf
, они реализуют только преобразование toString
, таким образом, здесь []
становится пустой строкой, [1]
становится "1"
, а [1,2]
становится "1,2"
.
Когда бинарный оператор плюс "+"
добавляет что-либо к строке, он тоже преобразует это в строку, таким образом:
alert( "" + 1 ); // "1"
alert( "1" + 1 ); // "11"
alert( "1,2" + 1 ); // "1,21"
Итого
Массив – это особый тип объекта, предназначенный для работы с упорядоченным набором элементов.
- Объявление:
// квадратные скобки (обычно) let arr = [item1, item2...]; // new Array (очень редко) let arr = new Array(item1, item2...);
Вызовnew Array(number)
создаёт массив с заданной длиной, но без элементов. - Свойство
length
отражает длину массива или, если точнее, его последний цифровой индекс плюс один. Длина корректируется автоматически методами массива. - Если мы уменьшаем
length
вручную, массив укорачивается.
Мы можем использовать массив как двустороннюю очередь, используя следующие операции:
push(...items)
добавляетitems
в конец массива.pop()
удаляет элемент в конце массива и возвращает его.shift()
удаляет элемент в начале массива и возвращает его.unshift(...items)
добавляетitems
в начало массива.
Чтобы пройтись по элементам массива:
for (let i=0; i<arr.length; i++)
– работает быстрее всего, совместим со старыми браузерами.for (let item of arr)
– современный синтаксис только для значений элементов (к индексам нет доступа).for (let i in arr)
– никогда не используйте для массивов!
Мы вернёмся к массивам и изучим другие методы добавления, удаления, выделения элементов и сортировки массивов в главе: Методы массивов.
Практика
Операции с массивами
важность: 5
Давайте произведём 5 операций с массивом.
- Создайте массив
styles
с элементами «Джаз» и «Блюз». - Добавьте «Рок-н-ролл» в конец.
- Замените значение в середине на «Классика». Ваш код для поиска значения в середине должен работать для массивов с любой длиной.
- Удалите первый элемент массива и покажите его.
- Вставьте «Рэп» и «Регги» в начало массива.
Массив по ходу выполнения операций:
Джаз, Блюз
Джаз, Блюз, Рок-н-ролл
Джаз, Классика, Рок-н-ролл
Классика, Рок-н-ролл
Рэп, Регги, Классика, Рок-н-ролл
Вызов в контексте массива
важность: 5
Каков результат? Почему?
let arr = ["a", "b"];
arr.push(function() {
alert( this );
})
arr[2](); // ?
Сумма введённых чисел
важность: 4
Напишите функцию sumInput()
, которая:
- Просит пользователя ввести значения, используя
prompt
и сохраняет их в массив. - Заканчивает запрашивать значения, когда пользователь введёт не числовое значение, пустую строку или нажмёт «Отмена».
- Подсчитывает и возвращает сумму элементов массива.
P.S. Ноль 0
– считается числом, не останавливайте ввод значений при вводе «0».