о.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():
var а = {"О":"а", ”2":"с”, length:3}; // Объект, подобный массиву
Array.prototype.join.call(a, "+") // => "a+b+c"
Array.prototype.slice.call(a, 0) // => ["a"."b","с"]: копия, настоящий массив
Array.prototype.map.call(a, function(x) { return x.toUpperCase();
}) // => ["А","В","C"]:
Мы уже встречались с таким использованием метода саll() в разделе 7.10, где описывался метод isArray(). Метод саll() объектов класса Function детально рассматривается в разделе 8.7.3.
Методы массивов, определяемые в ECMAScript 5, были введены в Firefox 1.5. Поскольку они имели универсальную реализацию, в Firefox также были введены версии этих методов в виде функций, объявленных непосредственно в конструкторе Array. Если использовать эти версии методов, примеры выше можно переписать так:
var а = {"О":"а", "1":"Ь", "2":"с", length;3}; // Объект, подобный массиву
Array.join(a, "+")
Array.slice(a, 0)
Array.map(a, function(x) { return x.toUpperCase(); })
Эти статические версии методов массивов чрезвычайно удобны при работе с объектами, подобными массивам, но, так как они не стандартизованы, нельзя рассчитывать, что они будут определены во всех броузерах. В своих программах вы можете использовать следующий программный код, который обеспечит доступность функций перед их использованием:
Array.join = Array.join || function(a,sep) {
return Array.prototype.join.call(a,sep);
};
Array.slice = Array.slice || function(a,from,to) {
return Array.prototype.slice.call(a,from,to);
};
Array.map = Array.map || function(a, f, thisArg) {
return Array.prototype.map.call(a, f, thisArg);
}
7.12. Строки как массивы
В ECMAScript 5 (и во многих последних версиях броузеров, включая IE8, появившихся до выхода стандарта ECMAScript 5) строки своим поведением напоминают массивы, доступные только для чтения. Вместо метода charAt() для обращения к отдельным символам можно использовать квадратные скобки: