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

на главную - закладки

Жанры

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

Решение заключается в том, чтобы выполнить проверку атрибута

class
(раздел 6.8.2) объекта. Для массивов этот атрибут всегда будет иметь значение «Array», благодаря чему в реализации ECMAScript 3 функцию
isArray
можно определить так:

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 - конечное число

о.length >= 0 && // о.length - положительное

о.length===Math.floor(o.length) && // о.length - целое

о.length < 4294967296)
// о.length < 2~32

return true; // Значит, объект о подобен массиву

else

return false; // Иначе - нет

}

В разделе 7.12 будет показано, что строки в ECMAScript 5 ведут себя подобно массивам (и некоторые броузеры обеспечивали возможность обращения к символам в строке по индексам еще до выхода ECMAScript 5). Однако проверки на подобие массивам, такие как приведенная выше, для строк обычно возвращают

false
– с ними лучше работать как со строками, чем как с массивами.

Методы массивов в языке JavaScript преднамеренно были сделаны достаточно универсальными, чтобы их можно было использовать не только с настоящими массивами, но и с объектами, подобными массивам. В ECMAScript 5 все методы массивов являются универсальными. В ECMAScript 3 универсальными также являются все методы, за исключением

toString
и
toLocaleString
. (К исключениям также относится метод
concat
: несмотря на то что его можно применять к объектам, подобным массивам, он некорректно разворачивает объекты в возвращаемый массив.) Поскольку объекты, подобные массивам, не наследуют свойства от
Array.prototype
, к ним нельзя напрямую применить методы массивов. Однако их можно вызывать косвенно, с помощью метода
Function.call:

Поделиться:
Популярные книги

Гвардия. (Дилогия)

Мусаниф Сергей Сергеевич
65. В одном томе
Фантастика:
научная фантастика
8.57
рейтинг книги
Гвардия. (Дилогия)

Остаться в живых

Сорока Ирина
1. Призрачная Академия
Фантастика:
фэнтези
7.95
рейтинг книги
Остаться в живых

Егерь. Столичный гамбит

Скиба Николай
4. Зверолов
Фантастика:
рпг
уся
фэнтези
фантастика: прочее
попаданцы
6.67
рейтинг книги
Егерь. Столичный гамбит

Сфабрикованный Иисус

Эванс Крейг
Религия. Настоящее христианство
Документальная литература:
критика
5.00
рейтинг книги
Сфабрикованный Иисус

Из истории русской, советской и постсоветской цензуры

Рейфман Павел Семенович
Научно-образовательная:
история
5.00
рейтинг книги
Из истории русской, советской и постсоветской цензуры

An ordinary sex life

Астердис
Любовные романы:
современные любовные романы
love action
5.00
рейтинг книги
An ordinary sex life

Что нас не убивает

Абвов Алексей Сергеевич
Фантастика:
фэнтези
киберпанк
рпг
8.71
рейтинг книги
Что нас не убивает

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Король Ардена

Анри Софи
Фантастика:
фэнтези
5.00
рейтинг книги
Король Ардена

История кавалерии. Вооружение, тактика, крупнейшие сражения

Денисон Джордж Тэйлор
Научно-образовательная:
история
cпецслужбы
военная история
5.00
рейтинг книги
История кавалерии. Вооружение, тактика, крупнейшие сражения

Советская республика и капиталистический мир. Часть I. Первоначальный период организации сил

Троцкий Лев Давидович
Документальная литература:
публицистика
5.00
рейтинг книги
Советская республика и капиталистический мир. Часть I. Первоначальный период организации сил

Сага о копье: Омнибус. Том II

Коллектив авторов
Сага о Копье
Фантастика:
фэнтези
5.00
рейтинг книги
Сага о копье: Омнибус. Том II

Вода в доме и на участке

Гальперина Галина Анатольевна
3. Домашний мастер
Дом и Семья:
прочее домоводство
6.25
рейтинг книги
Вода в доме и на участке

H2o

Дубинянская Яна
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
H2o