Однако, прежде чем перейти к изучению особенностей, следует сделать некоторые обобщения, касающиеся методов массивов в ECMAScript 5. Во-первых, большинство описываемых ниже методов принимают функцию в первом аргументе и вызывают ее для каждого элемента (или нескольких элементов) массива. В случае разреженных массивов указанная функция не будет вызываться для несуществующих элементов. В большинстве случаев указанной функции передаются три аргумента: значение элемента массива, индекс элемента и сам массив. Чаще всего вам необходим будет только первый аргумент, а второй и третий аргументы можно просто игнорировать. Большинство методов массивов, введенных стандартом ECMAScript 5, которые в первом аргументе принимают функцию, также принимают второй необязательный аргумент. Если он указан, функция будет вызываться, как если бы она была методом этого второго аргумента. То есть второй аргумент будет доступен функции, как значение ключевого слова this
. Значение, возвращаемое функцией, играет важную роль, но разные методы обрабатывают его по-разному. Ни один из методов массивов, введенных стандартом ECMAScript 5, не изменяет исходный массив. Разумеется, функция, передаваемая этим методам, может модифицировать исходный массив.
Метод forEach()
выполняет обход элементов массива и для каждого из них вызывает указанную функцию. Как уже говорилось выше, функция передается методу forEach()
в первом аргументе. При вызове этой функции метод forEach()
будет передавать ей три аргумента: значение элемента массива, индекс элемента и сам массив. Если вас интересует только значение элемента, можно написать функцию с одним параметром - дополнительные аргументы будут игнорироваться:
var data = [1,2,3,4,5]; // Массив, элементы которого будут суммироваться
// Найти сумму элементов массива
var sum =0; // Начальное значение суммы 0
data.forEach(function(value) { sum += value; }); // Прибавить значение к sum
sum // => 15
// Увеличить все элементы массива на 1
data.forEach(function(v, і, а) { а[і] = v + 1; });
data // => [2,3,4,5,6]
Обратите внимание, что метод fогEach()
не позволяет прервать итерации, пока все элементы не будут переданы функции. То есть отсутствует эквивалент инструкции break
, которую можно использовать с обычным циклом for
. Если потребуется прервать итерации раньше, внутри функции можно возбуждать исключение, а вызов forEach()
помещать в блок try
. Ниже демонстрируется функция foreach()
, вызывающая метод forEach()
внутри такого блока try
. Если функция, которая передается функции foreach()
, возбудит исключение foreach.break
, цикл будет прерван преждевременно:
function foreach(a,f,t) {
try {
a.forEach(f,t);
} catch(e) {
if (e === foreach.break)
return;
else throw e;
}
}
foreach.break = new Error("StopIteration");
Метод map()
передает указанной функции каждый элемент массива, относительно которого он вызван, и возвращает массив значений, возвращаемых этой функцией. Например:
а = [1, 2, 3];
b = a.map(function(x) { return х*х; }); // b = [1, 4, 9]
Метод map()
вызывает функцию точно так же, как и метод forEach()
. Однако функция, передаваемая методу map(),
должна возвращать значение. Обратите внимание, что map()
возвращает новый массив: он не изменяет исходный массив. Если исходный массив является разреженным, возвращаемый массив также будет разреженным: он будет иметь ту же самую длину и те же самые отсутствующие элементы.
Метод filter()
возвращает массив, содержащий подмножество элементов исходного массива. Передаваемая ему функция должна быть функцией-предикатом, т.е. должна возвращать значение true
или false
. Метод filter()
вызывает функцию точно так же, как методы forEach()
и map()
. Если возвращается true
или значение, которое может быть преобразовано в true
, переданный функции элемент считается членом подмножества и добавляется в массив, возвращаемый методом. Например:
Читать дальше
Конец ознакомительного отрывка
Купить книгу