, определяемой стандартом 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 - конечное число
В разделе 7.12 будет показано, что строки в ECMAScript 5 ведут себя подобно массивам (и некоторые броузеры обеспечивали возможность обращения к символам в строке по индексам еще до выхода ECMAScript 5). Однако проверки на подобие массивам, такие как приведенная выше, для строк обычно возвращают
false
– с ними лучше работать как со строками, чем как с массивами.
Методы массивов в языке JavaScript преднамеренно были сделаны достаточно универсальными, чтобы их можно было использовать не только с настоящими массивами, но и с объектами, подобными массивам. В ECMAScript 5 все методы массивов являются универсальными. В ECMAScript 3 универсальными также являются все методы, за исключением
toString
и
toLocaleString
. (К исключениям также относится метод
concat
: несмотря на то что его можно применять к объектам, подобным массивам, он некорректно разворачивает объекты в возвращаемый массив.) Поскольку объекты, подобные массивам, не наследуют свойства от
Array.prototype
, к ним нельзя напрямую применить методы массивов. Однако их можно вызывать косвенно, с помощью метода