i) cuál es la diferencia entre estos dos objetos
La respuesta simple es que [object]indica un objeto host que no tiene una clase interna. Un objeto de host es un objeto que no forma parte de la implementación de ECMAScript con la que está trabajando, pero que el host lo proporciona como una extensión. El DOM es un ejemplo común de objetos host, aunque en la mayoría de las implementaciones más recientes los objetos DOM heredan del Object nativo y tienen nombres de clase internos (como HTMLElement , Window , etc.). ActiveXObject, propiedad de IE, es otro ejemplo de objeto host.
[object] se ve más comúnmente al alertar a los objetos DOM en Internet Explorer 7 y versiones anteriores, ya que son objetos de host que no tienen un nombre de clase interno.
ii) que tipo de objeto es este
Puede obtener el "tipo" (clase interna) de objeto usando Object.prototype.toString. La especificación requiere que siempre devuelva una cadena en el formato [object [[Class]]], donde [[Class]]está el nombre de la clase interna como Object , Array , Date , RegExp , etc. Puede aplicar este método a cualquier objeto (incluidos los objetos host), usando
Object.prototype.toString.apply(obj);
Muchas isArrayimplementaciones usan esta técnica para descubrir si un objeto es realmente una matriz (aunque no es tan robusto en IE como en otros navegadores ).
iii) qué propiedades contiene este objeto y valores de cada propiedad
En ECMAScript 3, puede iterar sobre propiedades enumerables mediante un for...inbucle. Tenga en cuenta que la mayoría de las propiedades integradas no son enumerables. Lo mismo ocurre con algunos objetos host. En ECMAScript 5, puede obtener una matriz que contenga los nombres de todas las propiedades no heredadas utilizando Object.getOwnPropertyNames(obj). Esta matriz contendrá nombres de propiedad enumerables y no enumerables.