Массивы
Автор: Артемьев Сергей Игоревич ICQ: 438856621 email: _spin_@bk.ru |
Как и большинство языков программирования, JavaScript предоставляет средство для работы с формализованными данными большого объема - массивы. Массив - это список переменных, к каждой из которых можно получить доступ по её номеру. Массив создаётся следующим образом:
// создание пустого массива // задание значений первых двух элементов var myArray = new Array() myArray[0] = 'Москва' myArray[1] = 'Хабаровск' // создание нового массива // и резервирование места для // 100 переменных var myArray = new Array(100) // создание нового массива // и явная инициализация первого элемента var myArray = new Array('Элемент'); // косвенное создание массива // из двух элменетов var myArray = ['первый элемент', 'второй элемент']
Все массивы, независимо от способа создания, представляют собой экземпляры класса (объекта) Array. Добавление элементов производится простой инициализацией соответствующего элемента.
var myArray = new Array() myArray[0] = 'Питер'
Массивы в JavaScript не обязательно должны быть "сплошными", т.е. содержать все элементы. При необходимости можно создавать так называемые "разреженные" массивы:
var myArray = new Array(); myArray[0] = 'Питер' // пропустим myArray[1] myArray[2] = 'Гомель' // пропустим myArray[3] myArray[4] = 'Рязань' myArray[5] = 'Псков' for(i = 0; i < 6; i++) alert(myArray[i])
Этот код создаёт массив и заполняет только необходимые элементы. Теперь если мы попробуем получить значение не инициализированного элемента (в примере это первый и третий), то получим "undefined". Использование разреженных массивов иногда очень удобно, но требует опыта и внимательности, поэтому на начальном этапе лучше от них отказаться. Кроме того, разреженные массивы не дают выгоды по использованию памяти, т.к. место резервируется для всех элементов, в том числе не инициализированных.
Элементами массива могут быть переменные любого типа. Интересная особенность JavaScript - массив может одновременно содержать элементы различных типов, в том числе массивы:
// // массив с элементами разных типов // var myArrayS = new Array(); myArrayS[0] = 'Ярославль'; myArrayS[1] = 10000; myArrayS[2] = 'Ямал'; myArrayS[3] = 5000; for(i = 0; i < myArrayS.length; i += 2) alert('Город: ' + myArrayS[i] + '\n' + 'Население: ' + myArrayS[i + 1] + '\n') // // массив с элементами-массивами // var myArrayA = new Array() myArrayA[0] = new Array('Ярославль', 10000); myArrayA[1] = new Array('Ставрополь', 5000); for(i = 0; i < myArrayA.length; i++) alert('Город: ' + myArrayA[i][0] + '\n' + 'Население: ' + myArrayA[i][1] + '\n')
Класс Array содержит единственное свойство - length, позволяющее узнать текущую длину массива:
var myArray = new Array(); ... // узнать колиекчтво элементов alert(myArray.length) // добавить эдемент последним myArray[myArray.length] = 'последнее значение'
Обратите внимание, что значение Array.length на единицу больше номера последнего элемента массива, т.к. нумерация в массиве начинается с нуля, а свойство length показывает общее количество элементов.
Класс Array так же содержит ряд методов, существенно упрощающих некоторые рутинные операции с массивами:
Array.join() | Получение списка элементов массива в виде одной строки без разделителей. |
Array.join(разделитель) | Получение списка элементов массива в виде одной строки, причем элементы массива разделены строкой "разделитель" |
Array.reverse() | Изменение порядка сортировки массива. Этот метод "переворачитвает" массив: первый элемент становится последним и наоборот. |
Array.sort() | Сортировка массива по алфавиту. Если массив содержит числовые данные, то при сортировке используются их строковые представления. |
Array.sort(функция_сортировки) | Сортировка массива по пользовательскому критерию, который задаётся с помощью собственной функции сортировки: |
Рассмотрим небольшой пример:
// функция сортировки массива function sortByLength(a, b) { if(a.length > b.length) return 1; else if(a.length = b.length) return 0; else return -1; } // инициализация массива var myArray = new Array() myArray[0] = 'Ярославль' myArray[1] = 'Ямал' myArray[2] = 'Ставрополь' myArray[3] = 'Омск' myArray[4] = 'Анапа' alert('исходный массив:\n\n' + myArray.join('\n')) // сортируем по алфавиту myArray.sort(); alert('сортированный по алфавиту:\n\n' + myArray.join('\n')) // сортируем в обратном порядке myArray.reverse(); alert('перевёрнутый:\n\n' + myArray.join('\n')) // сортируем по длине с помощью собственной функции myArray.sort(sortByLength); alert('сортированный по длине:\n\n' + myArray.join('\n'))
Как видите, пользоваться методами массива очень просто. Самое интересное в этом примере - функция сортировки. Она должна всегда иметь два параметра и возвращать число. Порядок сортировки определяется знаком возвращаемого числа. Если число отрицательное - первый аргумент должен в массиве располагаться раньше второго, если положительное - позже. Если элементы равны, то обычно возвращается ноль, а порядок элементов не изменяется.
В JavaScript1.1 и выше реализованы дополнительные свойства и методы массивов, расширяющие возможности для программистов. Например, добавлены методы concat() и slice(), позволяющие собъединить массивы и получить кусок массива соответственно. К сожалению, ещё не все браузеры поддерживают JavaScript1.1 и JavaScript1.2, поэтому при разработке кроссбраузерных скриптов использовать новые нестандартные свойства и методы надо очень аккуратно.
Таким образом, массивы - это один из наиболее гибких и удобных механизмов JavaScript, т.к. позволяет с лёгкостью манипулировать даже относительно большими объемами данных. Массивы надо использовать везде, где заранее неизвестно количество хранимых данных и их тип.
С другой стороны, увлекаться и делать массивы из одного-двух элементов тоже не стоит. Перед созданием массива подумайте, а точно ли он нужен? Как показывает практика - в половине случаев проще обойтись двумя лишними переменными.