Как вывести элемент массива js
Для вывода элемента массива по его индексу используется синтаксис вида ‘имя_массива[индекс_элемента]’ .
Рассмотрим на примере:
const animals = ['cow', 'elephant', 'dog', 'cat', 'bird']; console.log(animals[0]); // => cow (нумерация в массиве начинается с 0, а не с 1!) console.log(animals[2]); // => dog console.log(animals[3]); // => cat
Для вывода последнего элемента массива воспользуемся свойством length , возвращающим длину массива, то есть количество элементов в нём:
console.log(animals[animals.length - 1]); // => bird
26 ноября 2021
Чтобы вывести один элемент из массива, можно обратиться к этому массиву по индексу:
const users = [ name: 'Name1' >, name: 'Name2' > ]; console.log(users[1]); // =>
Если нужно найти какой-то элемент по определенному свойству и вывести его, то можно воспользоваться методом поиска find() :
const users = [ name: 'Name1' >, name: 'Name2' > ]; const result = users.find((user) => user.name === 'Name2'); console.log(result); // =>
Array.prototype.find()
Метод find() возвращает значение первого найденного в массиве элемента, которое удовлетворяет условию переданному в callback функции. В противном случае возвращается undefined .
Также смотрите метод findIndex() , который возвращает индекс найденного в массиве элемента вместо его значения.
Если вам нужно найти позицию элемента или наличие элемента в массиве, используйте Array.prototype.indexOf() или Array.prototype.includes() соответственно.
Синтаксис
arr.find(callback[, thisArg])
Параметры
Функция, вызывающаяся для каждого значения в массиве, принимает три аргумента:
Текущий обрабатываемый элемент в массиве.
Индекс текущего обрабатываемого элемента в массиве.
Массив, по которому осуществляется проход.
Необязательный параметр. Значение, используемое в качестве this при выполнении функции callback .
Возвращаемое значение
Значение элемента из массива, если элемент прошёл проверку, иначе undefined .
Описание
Метод find вызывает переданную функцию callback один раз для каждого элемента, присутствующего в массиве, до тех пор, пока она не вернёт true . Если такой элемент найден, метод find немедленно вернёт значение этого элемента. В противном случае, метод find вернёт undefined . До Firefox 34 функция callback не вызывалась для «дырок» в массивах (bug 1058394).
Функция callback вызывается с тремя аргументами: значением элемента, индексом элемента и массивом, по которому осуществляется проход.
Если в метод find был передан параметр thisArg , при вызове callback он будет использоваться в качестве значения this . В противном случае в качестве значения this будет использоваться значение undefined .
Метод find не изменяет массив, для которого он был вызван.
Диапазон элементов, обрабатываемых методом find , устанавливается до первого вызова функции callback . Элементы, добавленные в массив после начала выполнения метода find , не будут посещены функцией callback . Если существующие, непосещение элементы массива изменяются функцией callback , их значения, переданные в функцию, будут значениями на тот момент времени когда метод find посетит их; удалённые элементы все ещё будут посещены.
Примеры
Пример: поиск простого числа в массиве
Следующий пример находит в массиве положительных чисел элемент, являющийся простым числом (либо возвращает undefined , если в массиве нет простых чисел).
function isPrime(element, index, array) var start = 2; while (start Math.sqrt(element)) if (element % start++ 1) return false; > > return element > 1; > console.log([4, 6, 8, 12].find(isPrime)); // undefined, не найдено console.log([4, 5, 8, 12].find(isPrime)); // 5
Полифил
Этот метод был добавлен в спецификации ECMAScript 6 и пока может быть недоступен во всех реализациях JavaScript. Однако, вы можете использовать следующий сниппет в качестве полифила:
// https://tc39.github.io/ecma262/#sec-array.prototype.find if (!Array.prototype.find) < Object.defineProperty(Array.prototype, 'find', < value: function(predicate) < // 1. Let O be ? ToObject(this value). if (this == null) < throw new TypeError('"this" is null or not defined'); >var o = Object(this); // 2. Let len be ? ToLength(? Get(O, "length")). var len = o.length >>> 0; // 3. If IsCallable(predicate) is false, throw a TypeError exception. if (typeof predicate !== 'function') < throw new TypeError('predicate must be a function'); >// 4. If thisArg was supplied, let T be thisArg; else let T be undefined. var thisArg = arguments[1]; // 5. Let k be 0. var k = 0; // 6. Repeat, while k < len while (k < len) < // a. Let Pk be ! ToString(k). // b. Let kValue be ? Get(O, Pk). // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)). // d. If testResult is true, return kValue. var kValue = o[k]; if (predicate.call(thisArg, kValue, k, o)) < return kValue; >// e. Increase k by 1. k++; > // 7. Return undefined. return undefined; >, configurable: true, writable: true >); >
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-array.prototype.find |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Array.prototype.findIndex() Экспериментальная возможность
- Array.prototype.every()
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 4 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
Четыре метода поиска в массивах JavaScript

В JavaScript имеется множество полезных способов поиска элементов в массивах. Вы всегда можете использовать простой цикл for , но в ES6+ есть много методов циклического перебора массива, позволяющих легко найти все необходимое.
Какие же из множества разных методов использовать в каждом случае? Например, нужно ли вам знать при поиске, есть ли вообще в массиве такой элемент? Хотите ли вы получить индекс элемента или сам элемент?
Мы расскажем о нескольких разных методах, но важно понимать, что все эти методы являются встроенными методами прототипа Array. Это означает, что вам просто нужно прикрепить их к любому массиву, используя точечную нотацию. Также это означает, что данные методы недоступны для объектов или чего-либо еще, кроме массивов (хотя есть пересечение со строками).
Мы рассмотрим следующие методы массивов:
includes
const alligator = ["thick scales", 80, "4 foot tail", "rounded snout"]; alligator.includes("thick scales"); // returns true
Метод .includes() возвращает логическое значение и позволяет определить, есть ли в массиве указанный элемент. Он выдает простой ответ true или false . Базовый синтаксис выглядит так:
arr.includes(valueToFind, [fromIndex]);
Как видите, в нашем примере у нас был только один параметр — valueToFind. Это значение, совпадение с которым нужно было найти в массиве. Дополнительный параметр fromIndex — это число, показывающее, от какого индекса нужно начинать поиск (значение по умолчанию 0, так что поиск выполняется во всем массиве). Итак, поскольку в нашем примере элемент ‘thick scales’ находится на индексе 0, следующий код выдаст значение false: alligator.includes(‘thick scales’, 1); потому что он выполняет поиск, начиная с индекса 1 и далее.
Теперь нужно отметить несколько важных вещей. Этот метод .includes() использует строгое сравнение. Если взять предыдущий пример, это означает, что следующий код выдаст значение false: alligator.includes(’80’); Это связано с тем, что хотя 80 == ’80’ имеет значение true, 80 === ’80’ имеет значение false — разные типы не проходят строгое сравнение.
find
Чем метод .find() отличается от метода includes()? Если в нашем примере мы просто заменим “includes” на “find”, мы получим следующее сообщение об ошибке:
Uncaught TypeError: thick scales is not a function
Это связано с тем, что метод find требует передачи функции. Метод find не будет просто использовать простой оператор сравнения как это делает “includes()”. Вместо этого он будет передавать каждый элемент в функцию и смотреть, какой результат она возвращает: true или false. Итак, хотя это сработает: alligator.find(() => ‘thick scales’); , вы наверное захотите поместить в функцию собственный оператор сравнения, чтобы она возвращала актуальный результат.
const alligator = ["thick scales", 80, "4 foot tail", "rounded snout"]; alligator.find(el => el.length 12); // returns '4 foot tail'
Эта простая функция в нашем методе find ищет каждый элемент массива с псевдонимом ‘el’, который мы присвоили, и останавливается, когда находит первый результат, дающий значение true. В нашем случае true имеет свойство длины менее 12 (у чисел нет свойства длины). Разумеется, вы можете сделать эту функцию настолько сложной, насколько это необходимо, чтобы условие true соответствовало вашим потребностям.
Обратите внимание, что этот код не возвращает true . Метод find возвращает не логическое значение, а первый совпадающий элемент. Если совпадающего элемента нет, то есть, если ни один элемент не соответствует критериям, определенным в вашей функции, она возвращает значение undefined . Обратите внимание, что функция возвращает только первое совпадение, так что если критериям соответствует несколько элементов, функция выведет только первый из них. Если бы в нашем примере была другая строка длиной меньше 12 после ‘4 feet tall’, результат бы не изменился.
В нашем примере мы использовали вызов с одним параметром. Вы также можете добавить параметры для ссылки на индекс текущего элемента. Другим параметром может быть весь массив целиком, но этот параметр используют редко. Приведем пример с использованием индекса:
alligator.find((el, idx) => typeof el === "string" && idx === 2); // returns '4 foot tall'
Мы знаем, что в нашем массиве есть 3 разных элемента, соответствующих первому условию (typeof el === ‘string’). Если бы это было единственное условие, метод бы возвратил первый результат, ‘thick scales’. Однако отличие заключается в том, что только у одного элемента есть индекс 2, и это элемент ‘4 foot tall’.
Если говорить об индексах, метод .findIndex() очень похож на этот. Этот метод также принимает функцию, но, как вы можете догадаться, он возвращает индекс совпадающего элемента, а не сам совпадающий элемент.
indexOf
const alligator = ["thick scales", 80, "4 foot tail", "rounded snout"]; alligator.indexOf("rounded snout"); // returns 3
Как и метод .includes() , метод .indexOf() использует строгое сравнение, а не функцию как метод .find() . Однако, в отличие от includes() , он возвращает индекс элемента, а не логическое значение. Вы также можете указать, с какого индекса массива можно начать поиск.
Я считаю indexOf() очень полезным методом. Это быстрый и удобный метод, позволяющий узнать, существует ли элемент в массиве, и где именно в массиве он находится. Как он показывает, существует ли элемент? Если он возвращает положительное число, мы знаем, что элемент существует, а если он возвращает значение -1, мы понимаем, что такого элемента нет.
alligator.indexOf("soft and fluffy"); // returns -1 alligator.indexOf(80); // returns 1 alligator.indexOf(80, 2); // returns -1
Как видите, хотя мы могли бы получить эту же информацию с помощью методов find() или findIndex() , здесь нам нужно писать намного меньше кода. Нам не нужно писать функцию для сравнения, поскольку она уже входит в метод indexOf .
Как и другие методы, indexOf() возвращает индекс первого найденного совпадающего элемента. JavaScript позволяет использовать альтернативный метод массива, .lastIndexOf() . Как вы можете догадаться, он делает то же, что и метод indexOf() , но начинает с последнего индекса массива и движется назад. Также вы можете указать второй параметр, но помните, что индексы не меняются просто потому, что вы используете другой метод.
const alligator = ["thick scales", 80, "4 foot tail", "rounded snout", 80]; alligator.indexOf(80); // returns 1 alligator.lastIndexOf(80); // returns 4 alligator.indexOf(80, 2); // returns 4 alligator.lastIndexOf(80, 4); // returns 4 alligator.lastIndexOf(80, 3); // returns 1
Бонус: filter
const alligator = ["thick scales", 80, "4 foot tail", "rounded snout", 80]; alligator.filter(el => el === 80); //returns [80, 80]
Метод filter() похож на метод find() тем, что он также требует передачи функции и условия возврата. Основное отличие заключается в том, что filter() всегда возвращает массив, даже если в нем есть только один совпадающий элемент. Однако он возвращает все совпадающие элементы, в то время как метод find() возвращает только первое совпадение.
Важно отметить, что метод filter возвращает все элементы, соответствующие вашим критериям. Возможно эта проблема есть только у меня, но я могу запутаться, думая, что я хочу отфильтровать какие-то элементы, чтобы их не было , в то время как на самом деле я указываю элементы, которые нужно вывести после фильтра.
Заключение
Самый удобный для меня метод поиска — это метод find() , но, как видите, все зависит от конкретной ситуации.
- Нужно ли вам просто узнать, есть ли такой элемент? Используйте .includes() .
- Вы хотите получить сам элемент? Используйте .find() или .filter() , если вам нужно несколько элементов.
- Хотите найти индекс элемента? Используйте .indexOf() или findIndex() для более сложного поиска.
Массивы в приведенных примерах были очень простыми. Вы можете столкнуться с массивом объектов. Вот несколько простых примеров, которые помогут вам пробраться через джунгли вложенных объектов:
const jungle = [ name: "frog", threat: 0 >, name: "monkey", threat: 5 >, name: "gorilla", threat: 8 >, name: "lion", threat: 10 > ]; // break the object down in order to use .includes() or .indexOf() const names = jungle.map(el => el.name); // returns ['frog', 'monkey', 'gorilla', 'lion'] console.log(names.includes("gorilla")); // returns true console.log(names.indexOf("lion")); // returns 3 - which corresponds correctly assuming no sorting was done // methods we can do on the array of objects console.log(jungle.find(el => el.threat == 5)); // returns object - console.log(jungle.filter(el => el.threat > 5)); // returns array - [, ]
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
Массивы
Объекты позволяют хранить данные со строковыми ключами. Это замечательно.
Но довольно часто мы понимаем, что нам необходима упорядоченная коллекция данных, в которой присутствуют 1-й, 2-й, 3-й элементы и т.д. Например, она понадобится нам для хранения списка чего-либо: пользователей, товаров, элементов HTML и т.д.
В этом случае использовать объект неудобно, так как он не предоставляет методов управления порядком элементов. Мы не можем вставить новое свойство «между» уже существующими. Объекты просто не предназначены для этих целей.
Для хранения упорядоченных коллекций существует особая структура данных, которая называется массив, Array .
Объявление
Существует два варианта синтаксиса для создания пустого массива:
let arr = new Array(); let arr = [];
Практически всегда используется второй вариант синтаксиса. В скобках мы можем указать начальные значения элементов:
let fruits = ["Яблоко", "Апельсин", "Слива"];
Элементы массива нумеруются, начиная с нуля.
Мы можем получить элемент, указав его номер в квадратных скобках:
let fruits = ["Яблоко", "Апельсин", "Слива"]; alert( fruits[0] ); // Яблоко alert( fruits[1] ); // Апельсин alert( fruits[2] ); // Слива
Мы можем заменить элемент:
fruits[2] = 'Груша'; // теперь ["Яблоко", "Апельсин", "Груша"]
…Или добавить новый к существующему массиву:
fruits[3] = 'Лимон'; // теперь ["Яблоко", "Апельсин", "Груша", "Лимон"]
Общее число элементов массива содержится в его свойстве length :
let fruits = ["Яблоко", "Апельсин", "Слива"]; alert( fruits.length ); // 3
Вывести массив целиком можно при помощи alert .
let fruits = ["Яблоко", "Апельсин", "Слива"]; alert( fruits ); // Яблоко, Апельсин, Слива
В массиве могут храниться элементы любого типа.
// разные типы значений let arr = [ 'Яблоко', < name: 'Джон' >, true, function() < alert('привет'); >]; // получить элемент с индексом 1 (объект) и затем показать его свойство alert( arr[1].name ); // Джон // получить элемент с индексом 3 (функция) и выполнить её arr[3](); // привет
Висячая запятая
Список элементов массива, как и список свойств объекта, может оканчиваться запятой:
let fruits = [ "Яблоко", "Апельсин", "Слива", ];
«Висячая запятая» упрощает процесс добавления/удаления элементов, так как все строки становятся идентичными.
Получение последних элементов при помощи «at»
Новая возможность
Эта возможность была добавлена в язык недавно. В старых браузерах может понадобиться полифил.
Допустим, нам нужен последний элемент массива.
Некоторые языки программирования позволяют использовать отрицательные индексы для той же цели, как-то так: fruits[-1] .
Однако, в JavaScript такая запись не сработает. Её результатом будет undefined , поскольку индекс в квадратных скобках понимается буквально.
Мы можем явно вычислить индекс последнего элемента, а затем получить к нему доступ вот так: fruits[fruits.length — 1] .
let fruits = ["Apple", "Orange", "Plum"]; alert( fruits[fruits.length-1] ); // Plum
Немного громоздко, не так ли? Нам нужно дважды написать имя переменной.
К счастью, есть более короткий синтаксис: fruits.at(-1) :
let fruits = ["Apple", "Orange", "Plum"]; // то же самое, что и fruits[fruits.length-1] alert( fruits.at(-1) ); // Plum
Другими словами, arr.at(i) :
- это ровно то же самое, что и arr[i] , если i >= 0 .
- для отрицательных значений i , он отступает от конца массива.
Методы pop/push, shift/unshift
Очередь – один из самых распространённых вариантов применения массива. В области компьютерных наук так называется упорядоченная коллекция элементов, поддерживающая два вида операций:
- push добавляет элемент в конец.
- shift удаляет элемент в начале, сдвигая очередь, так что второй элемент становится первым.
Массивы поддерживают обе операции.
На практике необходимость в этом возникает очень часто. Например, очередь сообщений, которые надо показать на экране.
Существует и другой вариант применения для массивов – структура данных, называемая стек.
Она поддерживает два вида операций:
- push добавляет элемент в конец.
- pop удаляет последний элемент.
Таким образом, новые элементы всегда добавляются или удаляются из «конца».
Примером стека обычно служит колода карт: новые карты кладутся наверх и берутся тоже сверху:
Массивы в JavaScript могут работать и как очередь, и как стек. Мы можем добавлять/удалять элементы как в начало, так и в конец массива.
В компьютерных науках структура данных, делающая это возможным, называется двусторонняя очередь.
Методы, работающие с концом массива:
Удаляет последний элемент из массива и возвращает его:
let fruits = ["Яблоко", "Апельсин", "Груша"]; alert( fruits.pop() ); // удаляем "Груша" и выводим его alert( fruits ); // Яблоко, Апельсин
И fruits.pop() и fruits.at(-1) возвращают последний элемент массива, но fruits.pop() также изменяет массив, удаляя его.
Добавляет элемент в конец массива:
let fruits = ["Яблоко", "Апельсин"]; fruits.push("Груша"); alert( fruits ); // Яблоко, Апельсин, Груша
Вызов fruits.push(. ) равнозначен fruits[fruits.length] = . .
Методы, работающие с началом массива:
Удаляет из массива первый элемент и возвращает его:
let fruits = ["Яблоко", "Апельсин", "Груша"]; alert( fruits.shift() ); // удаляем Яблоко и выводим его alert( fruits ); // Апельсин, Груша
Добавляет элемент в начало массива:
let fruits = ["Апельсин", "Груша"]; fruits.unshift('Яблоко'); alert( fruits ); // Яблоко, Апельсин, Груша
Методы push и unshift могут добавлять сразу несколько элементов:
let fruits = ["Яблоко"]; fruits.push("Апельсин", "Груша"); fruits.unshift("Ананас", "Лимон"); // ["Ананас", "Лимон", "Яблоко", "Апельсин", "Груша"] alert( fruits );
Внутреннее устройство массива
Массив – это особый подвид объектов. Квадратные скобки, используемые для того, чтобы получить доступ к свойству arr[0] – это по сути обычный синтаксис доступа по ключу, как obj[key] , где в роли obj у нас arr , а в качестве ключа – числовой индекс.
Массивы расширяют объекты, так как предусматривают специальные методы для работы с упорядоченными коллекциями данных, а также свойство length . Но в основе всё равно лежит объект.
Следует помнить, что в JavaScript существует 8 основных типов данных. Массив является объектом и, следовательно, ведёт себя как объект.
Например, копируется по ссылке:
let fruits = ["Банан"] let arr = fruits; // копируется по ссылке (две переменные ссылаются на один и тот же массив) alert( arr === fruits ); // true arr.push("Груша"); // массив меняется по ссылке alert( fruits ); // Банан, Груша - теперь два элемента
…Но то, что действительно делает массивы особенными – это их внутреннее представление. Движок JavaScript старается хранить элементы массива в непрерывной области памяти, один за другим, так, как это показано на иллюстрациях к этой главе. Существуют и другие способы оптимизации, благодаря которым массивы работают очень быстро.
Но все они утратят эффективность, если мы перестанем работать с массивом как с «упорядоченной коллекцией данных» и начнём использовать его как обычный объект.
Например, технически мы можем сделать следующее:
let fruits = []; // создаём массив fruits[99999] = 5; // создаём свойство с индексом, намного превышающим длину массива fruits.age = 25; // создаём свойство с произвольным именем
Это возможно, потому что в основе массива лежит объект. Мы можем присвоить ему любые свойства.
Но движок поймёт, что мы работаем с массивом, как с обычным объектом. Способы оптимизации, используемые для массивов, в этом случае не подходят, поэтому они будут отключены и никакой выгоды не принесут.
Варианты неправильного применения массива:
- Добавление нечислового свойства, например: arr.test = 5 .
- Создание «дыр», например: добавление arr[0] , затем arr[1000] (между ними ничего нет).
- Заполнение массива в обратном порядке, например: arr[1000] , arr[999] и т.д.
Массив следует считать особой структурой, позволяющей работать с упорядоченными данными. Для этого массивы предоставляют специальные методы. Массивы тщательно настроены в движках JavaScript для работы с однотипными упорядоченными данными, поэтому, пожалуйста, используйте их именно в таких случаях. Если вам нужны произвольные ключи, вполне возможно, лучше подойдёт обычный объект <> .
Эффективность
Методы push/pop выполняются быстро, а методы shift/unshift – медленно.
Почему работать с концом массива быстрее, чем с его началом? Давайте посмотрим, что происходит во время выполнения:
fruits.shift(); // удаляем первый элемент с начала
Просто взять и удалить элемент с номером 0 недостаточно. Нужно также заново пронумеровать остальные элементы.
Операция shift должна выполнить 3 действия:
- Удалить элемент с индексом 0 .
- Сдвинуть все элементы влево, заново пронумеровать их, заменив 1 на 0 , 2 на 1 и т.д.
- Обновить свойство length .
Чем больше элементов содержит массив, тем больше времени потребуется для того, чтобы их переместить, больше операций с памятью.
То же самое происходит с unshift : чтобы добавить элемент в начало массива, нам нужно сначала сдвинуть существующие элементы вправо, увеличивая их индексы.
А что же с push/pop ? Им не нужно ничего перемещать. Чтобы удалить элемент в конце массива, метод pop очищает индекс и уменьшает значение length .
Действия при операции pop :
fruits.pop(); // удаляем один элемент с конца
Метод pop не требует перемещения, потому что остальные элементы остаются с теми же индексами. Именно поэтому он выполняется очень быстро.
Аналогично работает метод push .
Перебор элементов
Одним из самых старых способов перебора элементов массива является цикл for по цифровым индексам:
let arr = ["Яблоко", "Апельсин", "Груша"]; for (let i = 0; i
Но для массивов возможен и другой вариант цикла, for..of :
let fruits = ["Яблоко", "Апельсин", "Слива"]; // проходит по значениям for (let fruit of fruits)
Цикл for..of не предоставляет доступа к номеру текущего элемента, только к его значению, но в большинстве случаев этого достаточно. А также это короче.
Технически, так как массив является объектом, можно использовать и вариант for..in :
let arr = ["Яблоко", "Апельсин", "Груша"]; for (let key in arr) < alert( arr[key] ); // Яблоко, Апельсин, Груша >
Но на самом деле это – плохая идея. Существуют скрытые недостатки этого способа:
- Цикл for..in выполняет перебор всех свойств объекта, а не только цифровых. В браузере и других программных средах также существуют так называемые «псевдомассивы» – объекты, которые выглядят, как массив. То есть, у них есть свойство length и индексы, но они также могут иметь дополнительные нечисловые свойства и методы, которые нам обычно не нужны. Тем не менее, цикл for..in выведет и их. Поэтому, если нам приходится иметь дело с объектами, похожими на массив, такие «лишние» свойства могут стать проблемой.
- Цикл for..in оптимизирован под произвольные объекты, не массивы, и поэтому в 10-100 раз медленнее. Увеличение скорости выполнения может иметь значение только при возникновении узких мест. Но мы всё же должны представлять разницу.
В общем, не следует использовать цикл for..in для массивов.
Немного о «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
Давайте теперь попробуем следующее: