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

7.10. Тип Array

7.10. Тип Array

На протяжении этой главы мы не раз имели возможность убедиться, что массивы являются объектами, обладающими особыми чертами поведения. Получая неизвестный объект, иногда бывает полезно проверить, является он массивом или нет. Сделать это в реализации ECMAScript 5 можно с помощью функции Array. isArray():

Array.isArray([]) // => true
Array.isArray({}) // => false

Однако до выхода стандарта ECMAScript 5 отличить массивы от других объектов было удивительно сложно. Оператор typeof никак не помогает в этом: для массивов он возвращает строку "object" (и для всех других объектов, кроме функций). В простых случаях можно использовать оператор instanceof:

[] instanceof Array // => true
({}) instanceof Array // => false

Проблема применения оператора instanceof состоит в том, что в веб-броузерах может быть открыто несколько окон или фреймов. Каждое окно или фрейм имеет собственное окружение JavaScript, с собственным глобальным объектом. А каждый глобальный объект имеет собственное множество функций-конструкторов. Поэтому объект из одного фрейма никогда не будет определяться как экземпляр конструктора в другом фрейме. Даже при том, что путаница между фреймами возникает довольно редко, тем не менее этого вполне достаточно, чтобы считать оператор instanceof ненадежным средством определения принадлежности к массивам.

Решение заключается в том, чтобы выполнить проверку атрибута 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.

Оглавление книги


Генерация: 1.499. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз