Чтение онлайн

ЖАНРЫ

JavaScript. Подробное руководство, 6-е издание
Шрифт:

6.10.4. Метод valueOf

Метод

valueOf
во многом похож на метод
toString,
но вызывается, когда интерпретатору JavaScript требуется преобразовать объект в значение какого-либо простого типа, отличного от строки, - обычно в число. Интерпретатор JavaScript вызывает этот метод автоматически, если объект используется в контексте значения простого типа. Метод
valueOf
по умолчанию не выполняет ничего, что представляло бы интерес, но некоторые встроенные классы объектов переопределяют метод
valueOf
(например,
Date.valueOf
). В разделе 9.6.3 описывается, как можно переопределить
метод
valueOf
в собственных типах объектов.

7

Массивы

Массив - это упорядоченная коллекция значений. Значения в массиве называются элементами, и каждый элемент характеризуется числовой позицией в массиве, которая называется индексом. Массивы в языке JavaScript являются нети-пизированными: элементы массива могут иметь любой тип, причем разные элементы одного и того же массива могут иметь разные типы. Элементы массива могут даже быть объектами или другими массивами, что позволяет создавать сложные структуры данных, такие как массивы объектов и массивы массивов. Отсчет индексов массивов в языке JavaScript начинается с нуля и для них используются 32-битные целые числа: первый элемент массива имеет индекс 0, а наибольший возможный индекс имеет значение 4294967294 (232– 2), т.е. максимально возможный размер массива составляет 4294967295 элементов. Массивы в JavaScript являются динамическими: они могут увеличиваться и уменьшаться в размерах по мере необходимости; нет необходимости объявлять фиксированные размеры массивов при их создании или повторно распределять память при изменении их размеров. Массивы в JavaScript могут быть разреженными: не требуется, чтобы массив содержал элементы с непрерывной последовательностью индексов - в массивах могут отсутствовать элементы с некоторыми индексами. Все массивы в JavaScript имеют свойство

length
. Для неразреженных массивов это свойство определяет количество элементов в массиве. Для разреженных массивов значение
length
больше числа всех элементов в массиве.

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

Массивы наследуют свои свойства от прототипа

Array.prototype
, который определяет богатый набор методов манипулирования массивами, о которых рассказывается в разделах 7.8 и 7.9. Большинство из этих методов являются универсальными, т. е. они могут применяться не только к истинным массивам, но и к любым объектам, «похожим на массивы». Объекты, похожие на массивы, будут рассматриваться в разделе 7.11. В ECMAScript 5 строки ведут себя как массивы символов, и мы обсудим такое их поведение в разделе 7.12.

7.1. Создание массивов

Легче всего создать массив с помощью литерала, который представляет собой простой список разделенных запятыми элементов массива в квадратных скобках. Например:

var empty = []; // Пустой массив

var primes = [2, 3, 5, 7, 11]; // Массив с пятью числовыми элементами

var misc = [ 1.1, true, "а", ]; // 3 элемента разных типов + завершающая запятая

Значения в литерале массива не обязательно должны быть константами - это могут быть любые выражения:

var base = 1024;

var table = [base, base+1, base+2, base+3];

Литералы массивов могут содержать литералы объектов или литералы других массивов:

var b = [[1,{х:1,
у:2}], [2, {х:3, у:4}]];

Если литерал массива содержит несколько идущих подряд запятых без значений между ними, создается разреженный массив (подробнее об этом рассказывается в разделе 7.3). Элементы, соответствующие таким пропущенным значениям, отсутствуют в массиве, но при обращении к ним возвращается значение

undefined
:

var count = [1,,3]; // Элементы с индексами 0 и 2. count[1] => undefined

var undefs =[,,]; // Массив без элементов, но с длиной, равной 2

Синтаксис литералов массивов позволяет вставлять необязательную завершающую запятую, т.е. литерал [,,] соответствует массиву с двумя элементами, а не с тремя.

Другой способ создания массива состоит в вызове конструктора

Аггау.
Вызвать конструктор можно тремя разными способами:

• Вызвать конструктор без аргументов:

var а = new Array;

В этом случае будет создан пустой массив, эквивалентный литералу [].

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

var а = new Array(10);

В этом случае будет создан пустой массив указанной длины. Такая форма вызова конструктора

Array
может использоваться для предварительного распределения памяти под массив, если заранее известно количество его элементов. Обратите внимание, что при этом в массиве не сохраняется никаких значений и даже свойства-индексы массива с именами «0», «1» и т. д. в массиве не определены.

• Явно указать в вызове конструктора значения первых двух или более элементов массива или один нечисловой элемент:

var а = new Array(5, 4, 3, 2, 1, "testing, testing");

В этом случае аргументы конструктора становятся значениями элементов нового массива. Использование литералов массивов практически всегда проще, чем подобное применение конструктора

Аггау.

7.2. Чтение и запись элементов массива

Доступ к элементам массива осуществляется с помощью оператора [ ]. Слева от скобок должна присутствовать ссылка на массив. Внутри скобок должно находиться произвольное выражение, возвращающее неотрицательное целое значение. Этот синтаксис пригоден как для чтения, так и для записи значения элемента массива. Следовательно, допустимы все приведенные далее JavaScript-инструкции:

var а = ["world"]; // Создать массив с одним элементом

var value = а[0]; // Прочитать элемент 0

а[1] = 3.14; // Записать значение в элемент 1

і = 2;

а[і] = 3; // Записать значение в элемент 2

а[і + 1] = "hello"; // Записать значение в элемент 3

а[а[і]] = а[0]; // Прочитать элементы 0 и 2, записать значение в элемент 3

Напомню, что массивы являются специализированной разновидностью объектов. Квадратные скобки, используемые для доступа к элементам массива, действуют точно так же, как квадратные скобки, используемые для доступа к свойствам объекта. Интерпретатор JavaScript преобразует указанные в скобках числовые индексы в строки - индекс 1 превращается в строку "1" , - а затем использует строки как имена свойств. В преобразовании числовых индексов в строки нет ничего особенного: то же самое можно проделывать с обычными объектами:

Поделиться с друзьями: