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 isArray
implementaçõ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...in
loop. 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.