i) qual é a diferença entre esses dois objetos
A resposta simples é que [object]indica um objeto host que não possui uma classe interna. Um objeto de host é um objeto que não faz parte da implementação ECMAScript com a qual você está trabalhando, mas é fornecido pelo host como uma extensão. O DOM é um exemplo comum de objetos de host, embora na maioria das implementações mais recentes os objetos DOM sejam herdados do objeto nativo e tenham nomes de classe internos (como HTMLElement , Window , etc). O ActiveXObject proprietário do IE é outro exemplo de um objeto host.
[object] é mais comumente visto ao alertar objetos DOM no Internet Explorer 7 e inferior, uma vez que são objetos de host que não têm nome de classe interno.
ii) que tipo de objeto é este
Você pode obter o "tipo" (classe interna) de objeto usando Object.prototype.toString. A especificação exige que sempre retorne uma string no formato [object [[Class]]], onde [[Class]]é o nome da classe interna, como Object , Array , Date , RegExp , etc. Você pode aplicar este método a qualquer objeto (incluindo objetos de host), usando
Object.prototype.toString.apply(obj);
Muitas isArrayimplementações usam essa técnica para descobrir se um objeto é realmente um array (embora não seja tão robusto no IE quanto em outros navegadores ).
iii) o que todas as propriedades que este objeto contém e os valores de cada propriedade
No ECMAScript 3, você pode iterar sobre propriedades enumeráveis usando um for...inloop. Observe que a maioria das propriedades integradas não são enumeráveis. O mesmo é verdade para alguns objetos hospedeiros. No ECMAScript 5, você pode obter uma matriz contendo os nomes de todas as propriedades não herdadas usando Object.getOwnPropertyNames(obj). Esta matriz conterá nomes de propriedade não enumeráveis e enumeráveis.