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

6.10.3. Метод toJSON()

В действительности

<b>Object.prototype</b>
не определяет метод
<b>toJSON()</b>
, но метод
<b>JS0N.stringify()</b>
(раздел 6.9) пытается отыскать и использовать метод
<b>toJSON()</b>
любого объекта, который требуется сериализовать. Если объект обладает этим методом, он вызывается и сериализации подвергается возвращаемое значение, а не исходный объект. Примером может служить метод
<b>Date.toJSON()</b>
.

6.10.4. Метод valueOf()

Метод

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

7

Массивы

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

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

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

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

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

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

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

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

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

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

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

<b>var base = 1024;</b>

<b>var table = [base, base+1, base+2, base+3];</b>

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

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

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

<b>undefined</b>
:

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

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

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

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

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

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

<b>var а = new Array();</b>

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

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

<b>var а = new Array(10);</b>

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

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

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