objetos (equivalente aos dicts do python, por exemplo), funções, arrays e o null. Tudo mais NÃO É considerado um objeto pela linguagem.
Hmm, será?
Na especificação da linguagem tem uma seção chamada "Fundamental Objects" que possui 5 sub-seções:
- Object Objects
- Function Objects
- Boolean Objects
- Symbol Objects
- Error Objects
Os dois primeiros são os que vc já citou (objetos e funções), mas depois temos booleanos, símbolos e erros (exceções, como ReferenceError
, etc).
E depois tem outras seções que tratam de tipos diferentes, mas que também são chamados de "objetos":
- Number Objects
- BigInt Objects
- The Math Object
- Date Objects
- String Objects
- RegExp (Regular Expression) Objects
Sem contar o Array, Map, Set, JSON, etc, todos esses são chamados de "Objects" pela especificação.
Só pra citar um exemplo, tanto /a/ instanceof Object
quanto [] instanceof Object
retornam true
(a regex e o array são subtipos de Object
).
No caso de números e strings é um pouco mais confuso: new String('a') instanceof Object
é true
mas 'a' instanceof Object
é false
. Isso é porque existem os tipos primitivos (string, números, etc), que não possuem métodos, mas quando vc tenta usar algum método (como 'abc'.includes('a')
) é feito um auto-boxing automático para a classe wrapper equivalente (mais detalhes aqui).
De qualquer forma, veja que existem vários tipos que são sub-tipos de Object
, e não se restringem aos que vc citou...
Inclusive, dá para definir propriedades em uma string, mas temos que usar o wrapper:
var x = new String('abc');
x.prop = 'oi';
console.log(x.prop); // oi
Se fizermos x = 'abc'
aí não funciona porque estamos usando o primitivo, e para definição de propriedades não é feito o auto-boxing. Mas enfim, String
é um objeto também. E o mesmo vale para Number
, Boolean
, etc.