Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Значением инструкции присваивания с разложением является полная структура данных справа, а не отдельные значения, извлеченные из нее. То есть из операторов присваивания можно составлять «цепочки», как показано ниже:
let first, second, all;
all = [first,second] = [1,2,3,4]; // first=1, second=2, all=[1,2,3,4]
Присваивание с разложением можно даже использовать для извлечения значений из вложенных массивов. В этом случае левая сторона инструкции присваивания должна выглядеть как литерал вложенного массива:
let [one, [twoA, twoB]] = [1, [2,2.5], 3]; // one=1, twoA=2, twoB=2.5
Присваивание с разложением можно также выполнять, когда справа находится объект. В этом случае конструкция слева должна выглядеть как литерал объекта: список пар имен свойств и имен переменных, разделенных запятыми, заключенный в фигурные скобки. Имя слева от каждого двоеточия - это имя свойства, а имя справа от каждого двоеточия - это имя переменной. Каждое свойство, указанное слева, будет отыскиваться в объекте справа от оператора присваивания, и его значение (или undefined) будет присвоено соответствующей переменной. Эта разновидность присваивания с разложением может сбивать с толку, особенно если в качестве имен свойств и переменных используются одни и те же идентификаторы. Необходимо понимать, что в примере ниже r, g и b - это имена свойств, a red, green и blue - имена переменных:
let transparent = {r:0.0, g:0.0, b:0.0, а:1.0}; // Цвет в формате RGBA
let {r:red, g:green, b:blue} = transparent; // red=0.0,green=0.0,blue=0.0
Следующий пример копирует глобальные функции из объекта Math
в переменные с целью упростить программирование большого количества тригонометрических операций:
// То же, что и let sin=Math.sin, cos=Math.cos, tan=Math.tan
let {sin:sin, cos:cos, tan:tan} = Math;
Подобно тому как присваивание с разложением может использоваться при работе с вложенными массивами, эта операция может использоваться при работе с вложенными объектами. В действительности, эти два синтаксиса можно комбинировать для описания произвольных структур данных. Например:
// Вложенная структура данных: объект содержит массив объектов
let data = {
name: "присваивание с разложением",
type: "расширение",
impl: [{engine: "spidermonkey", version: 1.7},
{engine: "rhino", version: 1.7}]
};
// Использовать присваивание с разложением для извлечения
// четырех значений из структуры данных
let ({name:feature,
impl: [{engine:impl1, version:v1},{engine:impl2}]} = data) {
console.log(feature); // Выведет "присваивание с разложением"
console.log(impl1); // Выведет "spidermonkey"
console.log(v1); // Выведет 1.7
console.log(impl2); // Выведет "rhino"
}
Имейте в виду, что подобные вложенные инструкции присваивания с разложением могут превратить программный код в трудночитаемые дебри, вместо того чтобы упростить его. Однако есть одна интересная закономерность, которая поможет вам разобраться в самых сложных случаях. Представьте сначала обычное присваивание (с единственным значением). После того как присваивание будет выполнено, переменную слева от оператора присваивания можно взять и использовать как выражение, которое будет возвращать присвоенное значение. Мы говорили, что в инструкции присваивания с разложением слева указывается синтаксическая конструкция, напоминающая литерал массива или объекта. Но обратите внимание, что после выполнения присваивания с разложением программный код слева, который выглядит как литерал массива или объекта, действительно будет интерпретироваться как обычный литерал массива или объекта: все необходимые переменные будут определены, и вы сможете копировать текст слева от знака «равно» и использовать его в своей программе как массив или объект.
11.4. Итерации
Проектом Mozilla в расширение JavaScript были добавлены новые способы выполнения итераций, включая цикл for each
, а также итераторы и генераторы в стиле языка Python. Они детально описываются ниже.
11.4.1. Цикл for/each
Цикл for/each
- это новая инструкция цикла, определяемая стандартом Е4Х. Е4Х (ECMAScript for XML) - это расширение языка, позволяющее употреблять в программах на языке JavaScript теги языка XML и предоставляющее функции для работы с данными в формате XML. Стандарт Е4Х реализован далеко не во всех веб-броузерах, но он поддерживается реализацией JavaScript проекта Mozilla, начиная с версии 1.6 (в Firefox 1.5). В этом разделе мы рассмотрим только цикл for/ each
и особенности его использования с обычными объектами, не имеющими отношения к XML. Остальные подробности о Е4Х приводятся в разделе 11.7.
Цикл for each
напоминает цикл for/in
. Однако вместо итераций по свойствам объекта он выполняет итерации по значениям свойств:
let о = {one: 1, two: 2, three: 3}
for(let p in o) console.log(p); // for/in: выведет 'one', 'two', 'three'
for each (let v in o) console.log(v); // for/each: выведет 1, 2, 3
При использовании с массивами цикл for/each
выполняет итерации по элементам (а не по индексам) массива. Обычно он перечисляет их в порядке следования числовых индексов, но в действительности такой порядок не определяется стандартом и не является обязательным:
а = ['один', два', 'три'];
for(let р in a) console.log(p); // Выведет индексы массива 0, 1, 2
for each (let v in a) console.log(v); // Выведет элементы 'один', 'два', три'
Обратите внимание, что область применения цикла for/each
не ограничивается элементами массива - он может перечислять значения перечислимых свойств объекта, включая перечислимые методы, унаследованные объектом. По этой причине обычно не рекомендуется использовать цикл for/each
для работы с объектами. Это особенно верно для программ, которые должны выполняться под управлением версий интерпретаторов JavaScript до ECMAScript 5, в которых невозможно сделать пользовательские свойства и методы неперечислимыми. (Смотрите аналогичное обсуждение цикла for/in
в разделе 7.6.)
11.4.2. Итераторы
В версии JavaScript 1.7 цикл for/in
был дополнен более универсальными возможностями. Цикл for/in
в JavaScript 1.7 стал больше похож на цикл for/in
в языке Python, он позволяет выполнять итерации по любым итерируемым объектам. Прежде чем обсуждать новые возможности, необходимо дать некоторые определения.
Итератором называется объект, который позволяет выполнять итерации по некоторой коллекции значений и хранит информацию о текущей «позиции» в коллекции. Итератор должен иметь метод next().
Каждый вызов метода next()
должен возвращать следующее значение из коллекции. Например, функция counter(),
представленная ниже, возвращает итератор, который, в свою очередь, возвращает последовательность увеличивающихся целых чисел при каждом вызове метода next().
Обратите внимание, что здесь для хранения текущей информации используется область видимости функции, образующая замыкание:
Интервал:
Закладка: