i) в чем разница между этими двумя объектами
Простой ответ заключается в том, что это [object]указывает на объект-хост, у которого нет внутреннего класса. Объект хоста - это объект, который не является частью реализации ECMAScript, с которой вы работаете, но предоставляется хостом в качестве расширения. Модель DOM является распространенным примером объектов хоста, хотя в большинстве новых реализаций объекты DOM наследуются от собственного объекта и имеют имена внутренних классов (например, HTMLElement , Window и т. Д.). Запатентованный IE ActiveXObject - еще один пример хост-объекта.
[object] чаще всего встречается при предупреждении объектов DOM в Internet Explorer 7 и ниже, поскольку они являются объектами хоста, не имеющими внутреннего имени класса.
ii) какой тип объекта это
Получить «тип» (внутренний класс) объекта можно с помощью Object.prototype.toString. Спецификация требует, чтобы он всегда возвращал строку в формате [object [[Class]]], где [[Class]]- внутреннее имя класса, такое как Object , Array , Date , RegExp и т. Д. Вы можете применить этот метод к любому объекту (включая объекты хоста), используя
Object.prototype.toString.apply(obj);
Многие isArrayреализации используют этот метод, чтобы определить, действительно ли объект является массивом (хотя в IE он не такой надежный, как в других браузерах ).
iii) какие свойства содержит этот объект, и значения каждого свойства
В ECMAScript 3 вы можете перебирать перечислимые свойства с помощью for...inцикла. Обратите внимание, что большинство встроенных свойств не перечислить. То же самое и с некоторыми хост-объектами. В ECMAScript 5 вы можете получить массив, содержащий имена всех ненаследуемых свойств, используя Object.getOwnPropertyNames(obj). Этот массив будет содержать неперечислимые и перечислимые имена свойств.