Выбрать главу

var isArray = Function.isArray || function(o) {

  return typeof о === "object" &&

        Object.prototype.toString.call(o) === "[object Array]";

};

Фактически именно такая проверка атрибута class выполняется в функции Array.isArray(), определяемой стандартом ECMAScript 5. Прием определения класса объекта с помощью Object.prototype.toString() был описан в разделе 6.8.2 и продемонстрирован в примере 6.4.

7.11. Объекты, подобные массивам

Как мы уже видели, массивы в языке JavaScript обладают некоторыми особенностями, отсутствующими в других объектах:

• Добавление нового элемента вызывает автоматическое обновление свойства length.

• Уменьшение значения свойства length вызывает усечение массива.

• Массивы наследуют множество удобных методов от Array.prototype.

• Атрибут class массивов имеет значение «Array».

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

Такие объекты, «подобные массивам», иногда используются для решения практических задач, и хотя с ними нельзя работать через методы массивов или ожидать специфического поведения свойства length, все же можно организовать перебор свойств объекта теми же программными конструкциями, которые используются при работе с настоящими массивами. Оказывается, что значительное число алгоритмов для работы с массивами вполне пригодно для работы с объектами, подобными массивам. Это особенно верно, если используемые алгоритмы не изменяют массивы или хотя бы не затрагивают его свойство length.

В следующем фрагменте создается обычный объект и к нему добавляются дополнительные свойства, которые превращают его в объект, подобный массиву, после чего производится перебор «элементов» получившегося псевдомассива:

var а = {}; // Для начала создать обычный пустой объект

// Добавить свойства, которые сделают его похожим на массив

var і = 0;

while(i < 10) {

  a[i] = і * і;

  і++;

}

a.length = і;

// Теперь можно обойти свойства объекта, как если бы он был настоящим массивом

var total = 0;

for(var j = 0; j < a.length; j++) total += a[j];

Объект Arguments, который описывается в разделе 8.3.2, является объектом, подобным массиву. В клиентском языке JavaScript такие объекты возвращаются многими методами объектной модели документа (DOM), такими как метод document. getElementsByTagName(). Следующая функция проверяет, является ли объект подобным массиву:

// Определяет, является ли о объектом, подобным массиву. Строки и функции имеют

// числовое свойство length, но они исключаются проверкой typeof.

// В клиентском JavaScript текстовые узлы D0M имеют числовое свойство length

// и, возможно, должны быть исключены дополнительной проверкой o.nodeType != 3.

function isArrayLike(o) {

  if (о &&                   // о не null, не undefined и т. д.

    typeof о === "object" && //о - объект

    isFinite(o.length) &&    // о.length - конечное число