Да, заморозка должна работать для массивов, поведение, которое вы испытываете, явно является ошибкой реализации.
Эта ошибка может быть связана с тем, что объекты массива реализуют собственный внутренний метод [[DefineOwnProperty]]
(магия, которая заставляет свойство length
работать).
Я только что протестировал его на двух реализациях, и он работает правильно (Chrome 16.0.888 и Firefox Aurora 8.02a).
По поводу вашего второго вопроса, ну, объекты массива наследуются от Array.prototype
, который наследуется от Object.prototype
, например, вы можете получить доступ к не затененным методам из Object.prototype
непосредственно для объектов массива:
['a'].hasOwnProperty('0'); // true
Но это не связано с тем, как работает typeof
, этот оператор вернет 'object'
для любого экземпляра объекта, независимо от его вида, и для значения null
, на которое люди всегда жаловались.
Остальные возможные возвращаемые значения оператора typeof
соответствуют примитивным типам языка: Number, String, Boolean, Symbol и Undefined.