Объявление массивов

var a = [];                                     // Объявление пустого массива
var a = [1, [7, 5.1], "a", {name: "Mike"}, 8];  // Массив может содержать любые данные
var a = new Array("a", "b", "c");               // Другой синтаксис объявления массива
var a = new Array(10);                          // Если единственный аргумент, то создается массив заданной длины

Операции с массивами

Перебор элементов массива
for(var i = 0; i < arr.length; i++) {
  console.log(arr[i]);
}
Изменение размера массива
var arr = [1, 2, 3];
arr.length = 2;                // [1, 2]
arr.length = 3;                // [1, 2, undefined]
Объект массива

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

var arr = [1, 2, 3];
function f(a) { a[0] = 0; }
f(arr);
console.log(arr);        // [0, 2, 3]

var arr = ["a", "b", "c"];
arr.type = "character";

Свойства массивов

  • length

Возвращает максимальный индекс массива + 1. Свойству можно присваивать значение. В этом случае длина массива будет меняться. При этом, в случае уменьшения размера массива, а затем его увеличения, урезанные элементы не сохраняют свои значения, а получают значения undefined. Самый простой способ очистить массив – это присвоить length = 0

var arr = [1, 2, 3];
arr.length;              // 3
arr[100] = 0;
arr.length;              // 101
arr.length = 2;          // [1, 2]
arr.length = 3;          // [1, 2, undefined]

Функции работы с массивами

  • concat(e1, e2, ...)

Возвращает массив, в котором объединены текущий массив и переданные элементы e1, e2, ...
Если в качестве аргумента задан массив, то он раскрывается и используются его элементы (раскрытие массива не рекурсивное, то есть более глубокие вложения массивов не раскрываются)

var arr = [1];
var a = arr.concat(2);                        // [1, 2]
var a = arr.concat(2, 3);                     // [1, 2, 3]
var a = arr.concat(2, [3, 4]);                // [1, 2, 3, 4]
var a = arr.concat(2, [3, [4]]);              // [1, 2, 3, [4]]
  • delete arr[i]

Удаляет элемент массива по индексу

var arr = [1, 2, 3];
delete arr[1];                                // [1, undefined, 3]
  • every(callback(item, i, arr), thisArg)

Возвращает true, если вызов callback вернёт true для каждого элемента массива. Метод не поддерживается в IE8 и ниже

var arr = [1, 2, 3, 4];
var a = arr.every(function(el){
	return el < 10;
});                                           // true
var a = arr.every(function(el){
	return el < 4;
});                                           // false
  • filter(callback(item, i, arr), thisArg)

Возвращает массив, в который войдут те элементы исходного массива, для которых функция callback вернет true. Метод не поддерживается в IE8 и ниже

var arr = [1, 2, 3, 4];
var a = arr.filter(function(el){
	return el > 2;
});                                           // [3, 4]
  • forEach(callback(item, i, arr), thisArg)

Для каждого элемента массива вызывается функция callback, которой передается три параметра: item - текущий элемент массива, i - позиция этого эелемента, arr - сам массив. Второй аргумент метода forEach - это необязательный параметр, через который можно передать контекст this для функции callback. Метод не поддерживается в IE8 и ниже

var arr = [1, 2, 3];
arr.forEach(function(item, i, ar){
	ar[i] += 1;
});                                           // [2, 3, 4]
  • indexOf(elem, pos)

Поиск элемента elem в массиве, начиная с позиции pos (по-умолчанию 0). Для поиска используется строгое сравнение ===. Возвращает номер элемента в массиве или -1, если элемент не найден. Метод не поддерживается в IE8 и ниже

var arr = [1, 2, "3", 2, 4];
var i = arr.indexOf(2);                       // 1
var i = arr.indexOf(1, 2);                    // -1
var i = arr.indexOf(3);                       // -1
var i = arr.indexOf("3");                     // 2
  • join(s)

Склеивает массив в строку с помощью разделителя s

var arr = [1, 2, 3];
var str = arr.join('-');              // "1-2-3"
var str = new Array(2).join('ту');    // 'туту'- повторение 2 раза строки 'ту'
  • lastIndexOf(elem, pos)

Поиск элемента elem в массиве с конца, с позиции pos (по-умолчанию +Infinity). Для поиска также используется строгое сравнение ===. Метод не поддерживается в IE8 и ниже

var arr = [1, 2, "3", 2, 4];
var i = arr.lastIndexOf(2);                   // 3
var i = arr.lastIndexOf(1, 2);                // 0
  • map(callback(item, i, arr), thisArg)

Возвращает массив, со значениями, которые вернет функция callback для каждого элемента исходного массива. Метод не поддерживается в IE8 и ниже

var arr = [1, 2, 3, 4];
var a = arr.map(function(el){
	return el > 2 ? 1 : 0;
});                                           // [0, 0, 1, 1]
  • pop()

Удаляет последний элемент из массива и возвращает его

var arr = [1, 2, 3];
var el = arr.pop();                           // el = 3, arr = [1, 2]
  • push(a)

Добавляет элемент в конец массива. Можно добавлять сразу несколько элементов, перечисленных через запятую

var arr = [1, 2, 3];
var el = arr.push(4);                         // [1, 2, 3, 4]
  • reduce(callback(value, item, i, arr), initValue)

Метод используется для вычисления какого-либо значения на основе элементов массива. Для каждого элемента массива вызывается функция callback, которой в параметре value передается значение, которое вернулось функцией на предыдущем элементе. После вызова функции последний раз, ее результат возвращается из метода.
При первом вызове функции callback в параметре value будет значение initVal, переданное методу. Если initVal не был передан методу, то в параметре value будет значение первого элемента массива, а перебор элементов начнется со второго. Метод не поддерживается в IE8 и ниже

var arr = [1, 2, 3];
var res = arr.reduce(function(val, el){
	return val + el;
});                                           // 1 + 2 + 3 = 6
var res = arr.reduce(function(val, el){
	return val + el;
}, 10);                                       // 10 + 1 + 2 + 3 = 16
  • reduceRight(callback(value, item, i, arr), initValue)

Метод работает точно также, как и reduce, только перебор элементов массива происходит в обратном порядке. Метод не поддерживается в IE8 и ниже

var arr = [1, 2, 3];
var res = arr.reduceRight(function(val, el){
	return val + el;
}, 10);                                       // 10 + 3 + 2 + 1 = 16
  • reverse()

Метод меняет порядок элементов в массиве на обратный

var arr = [1, 2, 3];
arr.reverse();                                // [3, 2, 1]
  • shift()

Удаляет из массива первый элемент и возвращает его. При этом все последующие элементы сдвигаются в начало, что дает более медленную работу метода по сравнению с методом pop

var arr = [1, 2, 3];
var el = arr.shift();                         // el = 1, arr = [2, 3]
  • slice(st, fin)

Возвращает часть массива с индекса st по fin (не включая fin). Отрицательные аргументы означают отсчет от конца массива. Если второй аргумент отсутствует, то идет до конца массива. Если ни один аргумент не указан, то вернется весь массив. Синтаксис метода такой же как у аналогичного метода для строки

var arr = [1, 2, 3, 4];
var a = arr.slice(1, 3);                      // [2, 3]
var a = arr.slice(2);                         // [3, 4]
var a = arr.slice(-1);                        // [4]
var a = arr.slice();                          // [1, 2, 3, 4]
  • some(callback(item, i, arr), thisArg)

Возвращает true, если вызов callback вернёт true для какого-либо элемента массива. Метод не поддерживается в IE8 и ниже

var arr = [1, 2, 3, 4];
var a = arr.some(function(el){
	return el > 2;
});                                           // true
var a = arr.some(function(el){
	return el > 4;
});                                           // false
  • sort(fn(a, b))

Сортирует элементы массива, используя функцию сравнения fn.
Функция сравнения получает на вход два элемента массива и должна вернуть:

  • положительное значение, если первый элемент больше второго,
  • отрицательное значение, если первый элемент меньше второго,
  • значение равное 0, если элементы равны.

Если функция не указана, то используется сравнение элементов с преобразованием их в строки. Для сортировки как правило используется алгоритм "быстрая сортировка"

var arr = [3, 1, 5, 2, 10];
arr.sort();                                   // [1, 10, 2, 3, 5]
arr.sort(function(a,b){
  return a - b;
});                                           // [1, 2, 3, 5, 10]
  • splice(i, n, e1, e2, ...)

Начиная с индекса i удаляет из массива n элементов, и на их место вставляет элементы e, перечисленные через запятую

var arr = [1, 2, 3];
arr.splice(1, 1, 1.1, [1.2, 1.3]);            // [1, 1.1, [1.2, 1.3], 3]
arr.splice(2, 1, 1.2);                        // [1, 1.1, 1.2, 3]
arr.splice(1, 2, 2);                          // [1, 2, 3]
  • unshift(a)

Добавляет элемент в начало массива. При этом все последующие элементы сдвигаются на +1 позицию, что дает более медленную работу метода по сравнению с методом push. Можно добавлять сразу несколько элементов, перечисленных через запятую. Порядок элементов сохраняется

var arr = [1, 2, 3];
var el = arr.unshift(0);                      // [0, 1, 2, 3]