Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Наконец существует многоцелевой метод splice()
, позволяющий вставлять, удалять и замещать элементы массивов. Он изменяет значение свойства length
и сдвигает элементы массива с более низкими или высокими индексами по мере необходимости. Подробности приводятся в разделе 7.8.
7.6. Обход элементов массива
Наиболее часто для обхода элементов массива используется цикл for
(раздел 5.5.3):
var keys = Object.keys(o); // Получить массив имен свойств объекта о
var values = [] // Массив для сохранения значений свойств
for(var і = 0; і < keys.length; i++) { // Для каждого элемента в массиве
var key = keys[і]; // Получить имя свойства по индексу
values[i] = о[key]; // Сохранить значение в массиве values
}
Во вложенных циклах и в других контекстах, когда скорость работы имеет критическое значение, иногда можно увидеть такой оптимизированный способ выполнения итераций по массиву, когда длина массива определяется только один раз, а не в каждой итерации:
for(var і = 0, len = keys.length; і < len; i++) {
// тело цикла осталось без изменений
}
В примерах выше предполагается, что выполняется обход плотного массива и все элементы содержат допустимые значения. В противном случае необходимо организовать проверку значений элементов массива перед их использованием. Если желательно исключить из обработки значения null, undefined
и несуществующие элементы, проверку можно записать так:
for(var і = 0; і < a.length; i++) {
if (!a[і]) continue; // Пропустить null, undefined и несуществ. элементы // тело цикла
}
Если необходимо пропустить только значение undefined и несуществующие элементы, проверку можно записать так:
for(var і = 0; і < a.length; i++) {
if (a[і] === undefined) continue; // Пропустить undefined + несуществ. эл.
// тело цикла
}
Наконец, если необходимо пропустить только несуществующие элементы, а элементы со значением undefined обрабатывать как обычные элементы, проверку можно записать так:
for(var і = 0; і < a.length; i++) {
if (!(i in a)) continue ; // Пропустить несуществующие элементы
// тело цикла
}
Для обхода разреженных массивов можно также использовать цикл for/in
(раздел 5.5.4). Этот цикл присваивает имена перечислимых свойств (включая индексы массива) переменной цикла. Отсутствующие индексы в итерациях не участвуют:
for(var index in sparseArray) {
var value = sparseArray[index];
// Далее следуют операции с индексами и значениями
}
Как отмечалось в разделе 6.5, цикл for/in
может возвращать имена унаследованных свойств, такие как имена методов, добавленных в Array.prototype
. По этой причине не следует использовать цикл for/in
для обхода массивов, не предусмотрев дополнительной проверки для фильтрации нежелательных свойств. Для этого можно было бы использовать, например, такие проверки:
for(var і in а) {
if (!a.hasOwnProperty(i)) continue; // Пропустить унаследованные свойства
// тело цикла
}
for(var і in а) {
// Пропустить і, если оно не является целым неотрицательным числом
if (String(Math.floor(Math.abs(Number(i)))) !== і) continue;
}
Спецификация ECM AScript допускает возможность обхода свойств объекта в цикле for/in
в любом порядке. Обычно реализации обеспечивают обход индексов массивов в порядке возрастания, но это не гарантируется. В частности, если массив имеет и свойства объекта, и элементы массива, имена свойств могут возвращаться в порядке их создания, а не в порядке возрастания числовых значений. Разные реализации по-разному обрабатывают эту ситуацию, поэтому, если для вашего алгоритма порядок выполнения итераций имеет значение, вместо цикла for/in
лучше использовать обычный цикл for
.
Стандарт ECMAScript 5 определяет множество новых методов, позволяющих выполнять итерации по элементам массивов в порядке возрастания индексов и передавать их функции, определяемой пользователем. Наиболее типичным представителем этих методов является метод forEach()
:
var data = [1,2,3,4,5]; // Этот массив требуется обойти
var sumOfSquares =0; // Требуется вычислить сумму квадратов элементов
data.forEach(function(x){ // Передать каждый элемент этой функции
sumOfSquares += х*х; // прибавить квадрат к сумме
});
sumOfSquares // =>55 : 1+4+9+16+25
forEach()
и другие родственные методы, предназначенные для выполнения итераций, позволяют использовать при работе с массивами простой и мощный стиль функционального программирования. Они описываются в разделе 7.9, и еще раз мы вернемся к ним в разделе 8.8, когда будем рассматривать приемы функционального программирования.
7.7. Многомерные массивы
JavaScript не поддерживает «настоящие» многомерные массивы, но позволяет неплохо имитировать их при помощи массивов из массивов. Для доступа к элементу данных в массиве массивов достаточно дважды использовать оператор []
. Например, предположим, что переменная matrix
- это массив массивов чисел. Каждый элемент matrix[x]
- это массив чисел. Для доступа к определенному числу в массиве можно использовать выражение matrix[x][y]
. Ниже приводится конкретный пример, где двумерный массив используется в качестве таблицы умножения:
// Создать многомерный массив
var table = new Array(10); // В таблице 10 строк
for(var і = 0; і < table.length; i++)
table[i] = new Array(10); // В каждой строке 10 столбцов
// Инициализировать массив
for(var row = 0; row < table.length; row++) {
for(col = 0; col < table[row].length; col++) {
table[row][col] = row*col;
}
}
// Расчет произведения 5*7 с помощью многомерного массива
var product = table[5][7]; // 35
7.8. Методы класса Array
Стандарт ECMAScript 3 определяет в составе Array.prototype
множество удобных функций для работы с массивами, которые доступны как методы любого массива. Эти методы будут представлены в следующих подразделах. Более полную информацию можно найти в разделе Array
в справочной части по базовому языку JavaScript. Стандарт ECMAScript 5 определяет дополнительные методы для выполнения итераций по массивам - эти методы рассматриваются в разделе 7.9.
Интервал:
Закладка: