Глава 3.10. Массивы: встроенный объект Array

Объект Array используется для создания массивов, т. е. упорядоченных наборов элементов любого типа. Доступ к элементу массива производится по его номеру в массиве, называемому индексом элемента; обозначается i-й элемент массива a как a[i]. Элементы массива нумеруются с нуля, т. е. массив a, состоящий из N элементов, содержит элементы a[0], a[1], …, a[N-1].

Для создания массивов используются следующие конструкторы массивов:

new Array()
new Array(размер)
new Array(элемент0, элемент1, …, элементN)

Здесь размер — любое числовое выражение, задающее количество элементов в массиве; элемент0, элемент1, …, элементN — любые выражения.

Первый конструктор создает пустой массив, второй — массив из размер элементов, третий создает массив из N+1 элементов и присваивает им соответствующие значения. Если размер не является числом без знака, то создается массив с единственным элементом, имеющим это значение.

Кроме того, массив может быть создан с помощью инициализатора массива:

[элемент0, элемент1, …, элементN]

Примеры:

var a = new Array(5);		// массив из 5 элементов
var b = new Array("строка");	// массив из 1 элемента "строка"
var c = new Array(1, 2, 3);	// массив из 3 элементов: 1, 2 и 3
var d = ["1", "2", "3"];	// то же самое

Мы можем неявно увеличить размер массива, присвоив значение элементу с несуществующим индексом, например:

var colors = new Array();		// пустой массив
colors[99] = "пурпурный";		// размер массива стал равен 100

Функции сопоставления строки с регулярным выражением (RegExp.exec, String.match и String.replace) в качестве результата возвращают массив. Такие массивы, помимо стандартных свойств, обладают дополнительными свойствами index и input (см. описание метода RegExp.exec).

Поддержка: Internet Explorer Методы pop, push, shift, unshift поддерживаются с версии 5.5.
           Netscape Navigator Соответствует стандарту (4.0+).
Свойства объекта Array
Свойство Описание Член прототипа
constructor Конструктор, который создал объект. Да
length Количество элементов в массиве. Нет
prototype Ссылка на прототип класса объектов. Нет
Методы объекта Array
Метод Описание Член прототипа
concat Объединяет два массива в один новый и возвращает его. Да
join Объединяет все элементы массива в текстовую строку. Да
pop Удаляет последний элемент массива. Да
push Добавляет элементы в конец массива. Да
reverse Изменяет порядок элементов массива на противоположный. Да
shift Удаляет первый элемент массива и возвращает его. Да
slice Извлекает часть массива и возвращает новый массив. Да
sort Сортирует элементы массива. Да
splice Заменяет часть массива. Да
toLocaleString Преобразует массив в строку с учетом формата операционной системы. Да
toString Преобразует массив в строку. Да
unshift Добавляет элементы в начало массива. Да
valueOf Возвращает примитивное значение массива. Да

Свойство length

Синтаксис: массив.length
Атрибуты:  { DontEnum, DontDelete }

Значением свойства length является размер массива, т. е. количество элементов в нем, например:

var x = new Array();
x[0] = "Строка";
x[5] = "Еще строка";
var l = x.length;	// l равно 6

Мы можем явно задать новый размер массива, изменяя значение свойства length. Если при этом новый размер массива меньше текущего, то лишние элементы массива будут удалены. Если же новый размер массива больше текущего, то к массиву будут добавлены новые элементы со значением undefined.

Метод concat

Синтаксис: массив.concat(массив1)
Аргументы: массив1 — выражение, возвращающее массив
Результат: новый массив

Метод concat объединяет массив и массив1 в новый массив и возвращает его. При этом все элементы массива массив1 добавляются в конец массива. Например, сценарий

var x = new Array(1, 2, 3);
var y = new Array(4, 5, 6);
document.write(x.concat(y));

выведет на экран обозревателя строку 1,2,3,4,5,6.

WDH+ См. также WDH+: Метод concat работает правильно.

Метод join

Синтаксис: массив.join(разделитель)
Аргументы: разделитель — любое строковое выражение
Результат: строковое значение

Метод join преобразует массив в строковое значение. Для этого все элементы массива преобразуются в строки, и эти строки объединяются в одну строку. Разделителем между ними в .результирующей строке является строка разделитель; если она опущена, то разделителем служит пустая строка. Например, сценарий

var x = new Array(1, 2, 3);
document.write(x.join("-"));

выведет на экран обозревателя строку 1-2-3.

Метод pop

Синтаксис: массив.pop()
Результат: значение последнего элемента массива

Метод pop удаляет последний элемент массива и возвращает его в качестве результата. Размер массива при этом уменьшается на 1. Например, сценарий

var x = ["a", "b", "c", "d"]
x.pop();
document.write(x);

выведет на экран обозревателя строку a,b,c.

Методы push и pop позволяют реализовать программный стек на базе объектов Array.

Метод push

Синтаксис: массив.push(элемент1, …, элементN)
Аргументы: элемент1, …, элементN — любые выражения
Результат: новая длина массива

Метод push добавляет значения аргументов в конец массива и возвращает в качестве результата новый размер массива, который при этом увеличивается на N. Например, сценарий

var x = ["a", "b", "c", "d"]
document.write(x.push("e");

выведет на экран обозревателя число 5.

Методы push и pop позволяют реализовать программный стек на базе объектов Array.

Метод reverse

Синтаксис: массив.reverse()
Результат: массив

Метод reverse изменяет порядок элементов в массиве на противоположный. При этом новый объект Array не создается, перестановка элементов производится в исходном массиве. Если не все элементы массива были определены, то им присваивается значение undefined. Например, сценарий

var x = new Array();
x[0] = 0; x[2] = 2; x[4] = 4;
document.write(x.reverse());

выведет на экран обозревателя строку 4,,2,,0.

Метод shift

Синтаксис: массив.shift()
Результат: значение первого элемента массива

Метод shift удаляет первый элемент массива и возвращает его в качестве результата. Размер массива при этом уменьшается на 1. Например, сценарий

var x = ["a", "b", "c", "d"]
x.shift();
document.write(x);

выведет на экран обозревателя строку b,c,d.

Методы shift и unshift позволяют реализовать программную очередь на базе объектов Array.

Метод slice

Синтаксис: массив.slice(начало [,конец]?)
Аргументы: начало и конец — любые числовые выражения
Результат: новый массив

Метод slice возвращает новый массив, содержащий указанную часть исходного массива. Аргумент начало задает индекс первого элемента копируемой части, необязательный аргумент конец — индекс ее последнего элемента. При этом:

  • Если значение конец неотрицательно, то копируются элементы массив[начало], массив[начало+1], …, массив[конец-1].
  • Если значение конец отрицательно, то копируются элементы массив[начало], массив[начало+1], …, массив[массив.length-конец-1], т. е. конец означает смещение от конца массива.
  • Если аргумент конец отсутствует, то копируются элементы массив[начало], массив[начало+1], …, массив[массив.length-1], т. е. копируются все элементы до конца массива.

Например, сценарий

var x = new Array(10);
for (i = 0; i < 10; i++)
  x[i] = i;
document.write(x.slice(5,-1));

выведет на экран обозревателя строку 5,6,7,8.

Метод sort

Синтаксис: массив.sort(функция?)
Аргументы: функция — функция сортировки, описанная ниже
Результат: массив

Метод sort сортирует элементы массива. При этом новый объект Array не создается, перестановка элементов производится в исходном массиве. Способ сортировки задается необязательным аргументом функция; если аргумента нет, то производится сортировка в лексикографическом порядке по возрастанию значений элементов, которые предварительно преобразуются в строки.

Функция должна иметь вид:

function compare(a, b) {
  if (a меньше b по критерию сортировки)
    return -1;
  if (a больше b по критерию сортировки)
    return 1;
  return 0;	// a равно b
}

Приведем пример сортировки массива в лексикографическом порядке по убыванию значений элементов. Следующий сценарий

function cmp(a, b) {
  if (String(a) > String(b))
    return -1;
  if (String(a) < String(b))
    return 1;
  return 0;
}

var flowers = ["астра", "роза", "пион", "ромашка"];
document.write(flowers.sort(cmp));

выведет на экран обозревателя строку ромашка,роза,пион,астра.

Метод splice

Синтаксис: массив.splice(начало, счетчик [,элементы]?)
Аргументы: начало и счетчик — любые числовые выражения
           элементы — список любых выражений через запятую
Результат: новый массив
Поддержка: Internet Explorer Поддерживается с версии 5.5.
           Netscape Navigator Не поддерживается.

Метод splice удаляет часть массива и возвращает ее в качестве результата. Если заданы элементы, то они вставляются вместо удаленной части массива. Аргумент начало задает индекс первого элемента удаляемой части, аргумент счетчик — количество удаляемых элементов. Например, сценарий

var x = new Array(10);
for (i = 0; i < 10; i++)
  x[i] = i;
x.splice(5, 3, -5, -6, -7);
document.write(x);

выведет на экран обозревателя строку 0,1,2,3,4,-5,-6,-7,8,9.

Метод toLocaleString

Синтаксис: массив.toLocaleString()
Результат: строковое значение

Метод toLocaleString преобразует массив в строковое значение, учитывая формат операционной системы. Результат зависит от объекта. Обычно он дает тот же результат, что и метод toString.

Метод toString

Синтаксис: массив.toString()
Результат: строковое значение

Метод toString преобразует массив в строковое значение. Для этого все элементы массива преобразуются в строки, и эти строки объединяются в одну строку через запятую. Например, сценарий

var x = new Array(1, 2, 3);
document.write(x.toString());

выведет на экран обозревателя строку 1,2,3.

Метод unshift

Синтаксис: массив.unshift(элемент1, …, элементN)
Аргументы: элемент1, …, элементN — любые выражения
Результат: новая длина массива

Метод unshift добавляет значения аргументов в начало массива и возвращает в качестве результата новый размер массива, который при этом увеличивается на N. Например, сценарий

var x = ["a", "b", "c", "d"]
document.write(x.unshift("e"));

выведет на экран обозревателя число 5.

Методы shift и unshift позволяют реализовать программную очередь на базе объектов Array.

Метод valueOf

Синтаксис: массив.valueOf()
Результат: строковое значение

Метод valueOf возвращает примитивное значение массива. Для этого все элементы массива преобразуются в строки, и эти строки объединяются в одну строку через запятую. Иными словами, этот метод возвращает тот же результат, что и метод toString.